gpt4 book ai didi

android - 同步 SQLite 数据库而不会导致多个 onChange

转载 作者:行者123 更新时间:2023-12-03 18:10:48 25 4
gpt4 key购买 nike

我们在我们的应用程序中本地存储一些项目的服务器状态的副本。当我们从服务器获取新数据时,项目可能已被更改、删除或插入。同步数据时,将从服务器获取所有当前数据。

本地列表:
第 1 项,进展 23
第 2 项,进度 75
第 3 项,进度 88

远程列表:(第 2 项已删除)
第 1 项,进度 55
第 3 项,进度 88
第 4 项,进度 1(新)

当前解决方案清除表,然后批量插入所有项目,如下所示:

  // 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在表格被清除时首先更新,清空我们的项目列表,并在使用新同步的列表更新后立即再次填充 View 。这导致了很多难看的眨眼。

反正有没有得到一个 onChange() ? applyBatch()似乎生成了一个 onChange()每次操作。你能以某种方式告诉 ContentProvider 威胁一堆更新吗?

或者是否有另一种方法可以基本上获取新列表(远程)并将其存储在数据库中?

最佳答案

正如你提到的 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()

关于android - 同步 SQLite 数据库而不会导致多个 onChange,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36767819/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com