2017-04-19 126 views
3

使用ContentResolver.applyBatch和ContentResolver.bulkInsert方法一次添加数千个联系人非常缓慢。 Android是否提供了一种不同的方式来批量添加联系人,这将大大加快速度?以编程方式批量添加数千个Android联系人

我到目前为止已经试过以下方法:

使用applyBatch(〜每千75秒触点)

对于每个联系人:

  • 创建一个新的ContentValues反对代表原始联系人
  • 构建新的ContentProviderOperation以将其插入到RawContacts表中
  • 此操作添加到列表中,并保存其指数
  • 创建ContentValues像姓名和电话号码等联系字段的对象
  • 建立一个新的ContentProviderOperation上述每一个具有反向引用原始接触插入到数据表插入操作
  • 添加这些操作列表

最后,使用ContentResolver.applyBatch应用所有操作。

使用bulkInsert(〜每千40秒触点)

对于每个联系人:

  • 创建一个新的ContentValues对象来表示一个原始接触
  • 构建一个新的ContentProviderOperation插入此进入RawContacts表
  • 将此操作添加到列表

然后,使用ContentResolver.applyBatch应用所有操作。这将返回一个ContentProviderResults数组。

现在,对于每个联系人:

  • 解析从相应ContentProviderResult原料接触ID。
  • 构建ContentValues对象数组的所有联系人的数据字段,每一个字段的原始接触ID
  • 使用ContentResolver.bulkInsert插入到这些数据表

问题

  • 在第二种方法中,我首先对RawContacts表条目应用批处理,然后对已批准的数据表应用bulkInsert。这是因为我无法找到一种方法来提供Data条目的原始联系人ID。是否有类似于bulkInsert的反向引用,允许我同时添加RawContacts和Data条目?
  • applyBatch和bulkInsert只能在一个批次中执行如此多的插入操作,然后才会抱怨事务太大。因此,他们必须应用于每500个联系人左右。有没有办法改变这个限制?
  • 是否有一些完全不同的,更快捷的方式来一次添加数千个联系人?

回答

0

第一种方法你已经表明是正确的道路要走,其他则是快那么第二种方法,它的安全为好。

正如你在相同的间歇操作都插入到RawContactsData,如果出现错误,一路上,这样你就不会与任何僵尸信息离开了DB将回滚在该批次之前的更改在任一表中。

为了加快速度,可以尝试在不同线程之间划分工作。

如果您有1000个联系人,请创建一个线程来处理前500个,另一个线程处理500个下一个线程,并让它们同时运行。 如果需要,您可以将其应用于更多的线程。

+0

谢谢,我会给你一个去。虽然我自己对#1和#2实施的测试显示#2的速度几乎快了一倍,但我有点困惑。不过,我可以欣赏稳健的论点。 – UtterlyConfused

+0

出于某种原因,当我在不同的线程上应用批处理时,批次必须更小或者我得到一个'TransactionTooLargeException'。当我将批量缩减到可以接受的程度时,最终不会比同步做任何事情更快。也许这是由'ContentResolver'施加的? – UtterlyConfused

相关问题