android - 使用 applyBatch 插入数千个联系人条目很慢

标签 android android-contentprovider android-contentresolver

我正在开发一个需要插入大量联系人条目的应用程序。目前大约有 600 个联系人,总共有 6000 个电话号码。最大的联系人有 1800 个电话号码。

截至今天的状态是我创建了一个自定义帐户来保存联系人,因此用户可以选择在联系人 View 中查看联系人。

但是触点的插入速度非常缓慢。我使用 ContentResolver.applyBatch 插入联系人。我尝试了不同大小的 ContentProviderOperation 列表(100、200、400),但总运行时间约为。相同。插入所有联系人和号码大约需要 30 分钟!

我发现的关于 SQlite 中缓慢插入的大多数问题都会引发事务。但由于我使用 ContentResolver.applyBatch 方法,我无法控制它,我会假设 ContentResolver 会为我处理事务管理。

所以,我的问题是:我做错了什么,或者我可以做些什么来加快速度?

安德斯

编辑: @jcwenger: 我懂了。很好的解释!

所以我必须先插入 raw_contacts 表,然后插入包含名称和数字的数据表。我将失去的是对我在 applyBatch 中使用的 raw_id 的反向引用。

所以我必须获取新插入的 raw_contacts 行的所有 id 以用作数据表中的外键?

最佳答案

使用 ContentResolver.bulkInsert (Uri url, ContentValues[] values) 代替 ApplyBatch()

ApplyBatch (1) 使用事务,(2) 它为整个批处理锁定一次 ContentProvider,而不是每次操作锁定/解锁一次。正因为如此,它比一次做一个(非批处理)要快一些。

但是,由于批处理中的每个操作都可以有不同的 URI 等,因此会产生大量开销。 “哦,一个新的操作!我想知道它在什么表中......在这里,我将插入一行......哦,一个新的操作!我想知道它在什么表中......” 无限。由于将 URI 转为表格的大部分工作都涉及大量字符串比较,因此显然非常慢。

相比之下,bulkInsert 将一大堆值应用于同一张表。它说,“批量插入......找到表,好吧,插入!插入!插入!插入!插入!”更快。

当然,它需要您的 ContentResolver 有效地实现 bulkInsert。大多数都这样做,除非你自己写,在这种情况下需要一些编码。

关于android - 使用 applyBatch 插入数千个联系人条目很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5596354/

相关文章:

Android:通过 Content Provider 访问 SQLite 数据库还是实现 DAO?

android - 指定为非null的参数为null:参数投影Content Provider Kotlin

android - 从 sqlite 数据库中选择每第 n 个术语,包括第一个

java - 使用 Volley 在 Android 中调用带有字符串参数的 API

android - 手机授权库错误

android - 从 URL 打开 PDF

android - 非法状态异常 : Invalid tables when trying to query database with ContentProvider

android - 如何获取访问我的应用程序内容提供者的应用程序包名称?

Android - 在查询后保留照片的 ID 并将数据保存到数据库中

android - 每 5 秒更新一次 GPS 监听器