我知道这已经在在不同的地方,包括有些感动在这里对堆栈溢出,但我正在寻找其他的解决方案,人们可能使用。所以请记住...
我正在开发一个应用程序,用户可以首先将其所有联系人与桌面应用程序OTA同步。这是通过Web服务调用完成的,该调用从服务器中获取一组100个联系人,下载并解析信息,将联系人插入Android Contact DB,确认收到这些联系人,然后对下一组重复先前的步骤100个联系人,直到同步完成。当用户有订单或1000-2000个联系人时,此过程效果很好,但是此应用程序的典型用户可以轻松拥有5000-6000个联系人(高级用户的10000+以上),在这种情况下,花费的时间比I想要。例如,大约5300个联系人的样本集可能需要大约13.5分钟才能完成。还不错,但是我
我已经记录了每个步骤所花费的时间,而且毫不奇怪,瓶颈似乎在于将数据插入Android Contract DB中。在浏览网络之后,我发现插入数千个联系人方面几乎没有帮助,但是我发现这似乎归为以下三类:
1)ContentProviderOperation-Google推荐的方法为我提供了53.5个联系人的13.5分钟基线。
2)大量插入-我读到builkInsert往往比applyBatch更有效率,但是当我自己尝试实现此功能时,实际上5250个联系人花费了25分钟。我有很多这样的感觉,这是因为我需要插入RawContact信息,然后保存生成的URI以用于创建bulkInsert的ContactsContract.Data,这自然通过ContentProviderOperation中的backValueReference来实现。此外,我查看了android源代码,但我没有感到bulkInsert非常高效。
3)使用DatabaseUtils.InsertHelper和事务创建优化的批量插入-不幸的是,这似乎适合那些创建了自己的内容提供者的人,因为您需要将基础数据库作为实例变量进行访问,而我尚未看到如何可以使用本机联系人数据库来完成。
有没有人有插入5000多个联系人的经验,或者我可能会寻求其他有助于减少时间的其他想法?还是应该将ContentProviderOperation视为已达到最佳状态?
不幸的是,我相信 1 是最好的选择。我怀疑与 iPhone 相比,您的大部分开销都在内容提供商设计固有的跨进程 IPC 中。
你对3的分析是正确的。
已取得 root 权限的设备上有一些选项可以绕过内容提供商,但我怀疑这就是您正在寻找的。
| 归档时间: | 
 | 
| 查看次数: | 1585 次 | 
| 最近记录: |