以编程方式批量添加数千个Android联系人

Utt*_*sed 5 android android-contentresolver android-contacts

使用ContentResolver.applyBatch和ContentResolver.bulkInsert方法一次性添加数千个联系人非常慢。Android是否提供另一种方式来批量添加联系人,而这种方式会更快呢?

到目前为止,我已经尝试了以下方法:

使用applyBatch(每千个联系人约75秒)

对于每个联系人:

  • 创建一个新的ContentValues对象以表示原始联系人
  • 生成一个新的ContentProviderOperation,将其插入到RawContacts表中
  • 将此操作添加到列表并存储其索引
  • 为其他联系人字段(例如姓名和电话号码)创建ContentValues对象
  • 生成一个新的ContentProviderOperation,以将其插入到Data表中,并向后引用原始联系人插入操作
  • 将这些操作添加到列表中

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

使用bulkInsert(每千个联系人约40秒)

对于每个联系人:

  • 创建一个新的ContentValues对象以表示原始联系人
  • 生成一个新的ContentProviderOperation,将其插入到RawContacts表中
  • 将此操作添加到列表中

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

现在,对于每个联系人:

  • 从相应的ContentProviderResult解析原始联系人ID。
  • 为联系人的所有数据字段构造一个ContentValues对象的数组,每个数据字段都带有一个原始联系人ID的字段
  • 使用ContentResolver.bulkInsert将它们插入到数据表中

问题

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

mar*_*mor 0

您展示的第一种方法是正确的方法,除了比第二种方法更快之外,它也更安全。

当您在同一个批处理操作中插入两者时RawContactsData如果在此过程中出现问题,数据库将回滚该批处理之前的更改,这样您就不会在两个表中留下任何僵尸信息。

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

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