我正在开发一个需要插入大量联系人条目的应用程序。目前大约有 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/