我們在本地應用程序中存儲了一些本地服務器狀態的副本。當我們從服務器獲取新數據時,項目可能已被更改,刪除或插入。數據同步時,所有當前數據都從服務器獲取。同步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威脅只有一個更新嗎?
或者還有另一種基本上採取新列表(遠程)並將其存儲在數據庫中的方法?