gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:00:54 27 4
gpt4 key购买 nike

使用 ContentResolver.applyBatch 和 ContentResolver.bulkInsert 方法一次添加数千个联系人非常慢。 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 表条目执行 applyBatch,然后对数据表条目执行 bulkInsert。这是因为我无法找到一种方法来为数据条目提供原始联系人 ID。是否有类似于 bulkInsert 的反向引用的东西允许我同时添加 RawContacts 和数据条目?
  • applyBatch 和 bulkInsert 在提示事务太大之前只能在一批中执行这么多次插入。因此,它们必须每 500 个联系人左右应用一次。有没有办法改变这个限制?
  • 是否有一些完全不同的、更快捷的方法可以一次添加数千个联系人?

最佳答案

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

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

要加快速度,请尝试将工作分配给不同的线程。

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

关于android - 以编程方式批量添加数千个 Android 联系人,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43496720/

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