2011-07-05 67 views
14

我正在編寫自己的ContentProvider,它將使用SyncAdapter同步到Web服務。防止網絡同步循環在Android ContentProvider網絡中同步

當同步適配器修改內容提供者的數據時,會發生問題當內部調用getContentResolver()。notifyChange導致同步循環時,提供程序觸發網絡同步。

當客戶端應用程序進行修改時,需要使用網絡同步標誌的notifyChange,但在同步適配器正在修改時應該避免。

如何在一個contentprovider內輕鬆地判斷客戶端應用程序(應該在修改時會觸發網絡同步)還是由同步適配器(不應觸發網絡同步)使用它。

目前,我正在使用不同的CONTENT_URI(同步適配器使用CONTENT_URI_NO_SYNC訪問數據,使用CONTENT_URI訪問客戶端應用程序)能夠區分這兩種訪問類型並相應地設置網絡同步標誌。

回答

34

關於SyncAdapter的REST API使用的手錶this video s。

他們討論的方法是向數據庫添加一組元數據標誌列。這允許我們做3件事。

  1. 標誌本身允許SyncAdapter確定需要更改的行以及這些更改的內容。你如何區分本地創建的行和本地修改的行之間的區別?此外,您如何知道要調用哪個REST API?如果你只是連續刪除,你的SyncAdapter如何知道要刪除的行如果數據現在沒有了?相反,設置「應該刪除」標誌,然後,當SyncAdapter運行時,它知道將刪除推送到服務器。

  2. 的標誌讓你CursorAdapter修改所創建的視圖(如添加一個Spinner表明,「該行正在同步」)

  3. 最後,這他們點出,這些標誌允許您說明行被修改的原因。如果沒有設置任何標誌並且該行發生更改,則必須已由於來自服務器的更新。因此,不需要同步到網絡。

所以,這兩個工作流程如下:

局部變化

  1. 應用程序創建新行。行「創建」標誌是真實的。
  2. ContentProvider的存儲行,看到創建標誌,所以它調用notifyChange(...,true);
  3. 同步到網絡=真(最後一個參數)導致SyncAdapter火。
  4. SyncAdapter掃描數據庫,找到具有創建標誌設置的行並執行相應的服務器操作。成功後,SyncAdapter清除標誌。(行更新ContentProvivder
  5. ContentProvider看到標誌清除,沒有標誌設置,因此它調用notifyChange(...,false);
  6. ContentObserver看看國旗變化,更新,看起來像「同步完成」

所有這些步驟都是等效更新/刪除 - 每個可同步行的一個標誌都可以創建/更新/刪除的。 另請注意另一個贏 - 如果「創建」臨時失敗怎麼辦?服務器關閉...你怎麼知道要重試? - 很簡單,您不清除「創建」標誌,並在15分鐘後看到它。

遠程更改

  1. SyncAdapter火災是由於週期性同步。
  2. SyncAdapter從服務器獲取更新。將更改推送到數據庫中。不設置任何標誌。 ContentProvider看到缺少標誌,知道變化必須來自服務器(或不是需要推送到服務器的數據庫更改),所以它調用notifyChange(...,false);
  3. ContentObserver s看到內容更改,所以它們用新的行數據更新
+0

很好的答案!現在一切都清楚了,謝謝! – m1h4

+2

+1關於Google I/O對話有很多評論,但很少有人傾向於使用選項C.感謝您清楚地總結。 –

+1

根據標誌設置syncToNetwork是我的缺失鏈接。好的解決方案 –