2

我們在本地應用程序中存儲了一些本地服務器狀態的副本。當我們從服務器獲取新數據時,項目可能已被更改,刪除或插入。數據同步時,所有當前數據都從服務器獲取。同步SQLite數據庫,而不會導致多個onChange

本地列表:
第1項,進展23
第2項,進展75
第3項,進展88

遠程列表:(第2項中除去)
第1項,進度55
第3項,進展88
第4項,進展1(NEW)

目前的解決方案清除表,然後批量插入所有項目是這樣的:

// Remove old content (this is to prevent dead items being left) 
    mContentResolver.delete(URI_TO_TABLE, null, null); 

    // Insert all new items 
    // Most existing items are changed in a sync, hence we may just insert them again instead of updating 
    final ContentValues[] inserts = new ContentValues[newItems.size()]; 
    for (int i = 0; i < newItems.size(); i++) { 
     inserts[i] = getChallengeContentValues(newItems.get(i)); 
    } 
    mContentResolver.bulkInsert(URI_TO_TABLE, inserts); 

這裏的問題是,我們還使用了ContentObserver,它發送了兩次onChange()每次(一個用於刪除和一個用於bulkInsert),導致我們的UI,以表格時清除第一次更新,清空我們的名單的項目,並且在用新同步的列表更新之後直接再次填充視圖。這導致了很多醜陋的閃爍。

無論如何只能得到一個onChange()applyBatch()似乎每個操作產生一個onChange()。你能以某種方式告訴ContentProvider威脅只有一個更新嗎?

或者還有另一種基本上採取新列表(遠程)並將其存儲在數據庫中的方法?

回答

0

正如您所提到的applyBatch()是正確的做法。爲每個添加/更新/刪除交易創建ContentProviderOperation,將它們存儲爲ArrayList<ContentProviderOperation> operations,然後像在單個applyBatch()操作中一樣運行它們。

http://developer.android.com/reference/android/content/ContentProvider.html#applyBatch%28java.util.ArrayList%3Candroid.content.ContentProviderOperation%3E%29

如果你的表是巨大的,你不希望有applyBatch()的開銷和需要必須使用bulkInsert(),那麼你可以添加某種黑客如添加額外的刪除查詢會會指示供應商不觸發notifyDataSetChanged()

相關問題