2013-09-30 71 views
2

嗨同步我的數據庫與服務器的任何增量值單擊按鈕。下面是一個檢查所有的值,如果數據丟失插入但在Android的觀點是沒有任何優化技術來做到同步主同步數據庫

//new fields 

    public void updatenewfileds(ArrayList<String> s) { 

     ArrayList<String> da = new ArrayList<String>(); 

     try { 
      String manu = "select MANUFACTURERID from ManufacturerDesc"; 
      Cursor cc = mDb.rawQuery(manu,null); 

      Log.d("Cursor count", "Count =" + cc.getCount()); 
      if (cc != null && cc.getCount() > 0) { 
       if (cc.moveToFirst()); 
       do { 
        da.add(cc.getString(cc.getColumnIndex("MANUFACTURERID"))); 
        System.out.println("here got all alreday avilable ids"+ cc.getString(cc.getColumnIndex("MANUFACTURERID"))); 
       } while (cc.moveToNext()); 
       cc.close(); 
      } else { 
       cc.close(); 
      } 
      // need to add only missing data 
      for(int i = 0; i<da.size(); i++){    
       boolean flag = false; 
       System.out.println(flag); 
       for(int j=0; j<i; j++){ 
        if(da.get(i).equals(s.get(i*2))){ 
         flag = true; 
         break; 
        } 
       } 

      if(flag == false){ 
      String sql = "insert into ManufacturerDesc values('"+ s.get(i*2)+"','"+ s.get(i*2+1)+"');"; 
      System.out.println("item inserted into db"+ s.get(i*2) +"******" + s.get(i*2+1)); 
      mDb.execSQL(sql); 
      } 
      } 

     } catch (SQLException mSQLException) { 
      Log.e(TAG, "getTestData >>" + mSQLException.toString()); 

      throw mSQLException; 
     } 

    } 
+0

此方法是否接收每次從服務器接收完整數據庫? – cYrixmorten

+0

@cYrixmorten是的,它檢查缺失的數據併發送它,但它每次檢查完整的數據庫 – Pooja

回答

2

這將是我的建議的代碼中,[]只是強調,因爲我可能會回去吧:

  • 設計你的Android數據庫表像:{_id,[SERVER_ID],..您的數據..}
  • 在服務器上的所有表添加[time_changed]時間戳。
  • 每當你的設備得到與服務器同步,服務器應該還發送最後一次同步的時間戳例如System.currentTimeMilliseconds()(讓服務器這樣做以避免依賴同步時鐘)。此時間戳存儲在Android設備上,並在請求新同步時使用。
  • 當服務器接收一個同步請求所存儲的上次同步時間戳被再次切換到從設備的服務器。現在一個簡單的查詢可以提取自時間戳以來所有相關的添加數據(減去一些常量以確保您獲得所有內容)。例如SELECT * FROM Mydata WHERE(time_changed>(last_sync-5000)); 5000秒5秒。
  • 現在,當你從服務器接收數據,記得要加的[SERVER_ID],這僅僅是從服務器上自動遞增_id。這使您可以推斷是否知道某些收到的行(可能在上面減去5秒)。
  • 扣除是對設備的簡單查詢,例如:我是否已經有一行[server_id],如果不是我們添加它,如果是,則跳過它。

使用此方法,您可以避免隨着時間的推移發送更多信息,因爲您只發送最後一次同步後更改的行(再多一點)。

如果您的服務器上編輯行,只需更新再次time_changed,以反映編輯。然後它會在下一次同步時自動包含在設備上並覆蓋。

如果你打算在android設備上做很多數據庫操作,我會建議嘗試MotoDev,它可以插入到eclipse中,並有一些很好的數據庫功能。包括數據庫視角和ContentProviders的自動生成(很好的類來簡化數據庫操作)。

給出一個完整的解釋或指導做所有這些超出了這個答案的範圍。它只應該給你一個關於如何完成的想法,如果你想改進你的同步過程,你現在有一些指導。

關於機制作爲數據庫中的自動增量和時間戳,有大量的例子可以在interwebz上找到。

快樂編碼:)

+0

@cYrixmoten是的,但你有任何教程來做到這一點pl – Pooja

+0

它是什麼?我很抱歉,但在aprox之前將無法完成我的答案。從現在起3,5個小時。將回到它。 – cYrixmorten

+0

引入時間戳和做增量數據以獲得添加@cYrixmoten – Pooja