【问题标题】:Whats the fastest way to create large numbers of contacts?创建大量联系人的最快方法是什么?
【发布时间】:2012-05-24 11:17:45
【问题描述】:

在我的应用程序中,我需要创建大量联系人。

我目前使用的代码:

        ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
        ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
                .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, accounts[0].type)
                .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, accounts[0].name)
                .build());
        ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
                .withValue(ContactsContract.Data.MIMETYPE,
                        ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
                        .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name)
                        .build());
        ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
                .withValue(ContactsContract.Data.MIMETYPE,
                        ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
                        .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, number)
                        .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_HOME)
                        .build());
        ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
                .withValue(ContactsContract.Data.MIMETYPE,
                        ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
                        .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, number)
                        .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)
                        .build());


        try {
            cr.applyBatch(ContactsContract.AUTHORITY, ops);
        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (OperationApplicationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

对于某些数量的联系人,代码可以完美运行,但如果我创建大量联系人,则此代码会变慢。因此我的问题是:创建大量联系人的最快方法是什么?

在此先感谢,欢迎任何想法的建议。

【问题讨论】:

  • 您需要多少联系人?您希望以多快的速度加载这些联系人?

标签: android contacts android-contacts


【解决方案1】:

如果您可以与 gmail 同步,则可以将 gmail.com 中的联系人(以 CSV 格式)导入并同步到手机。

或者只是看到这个类似的问题:Insertion of thousands of contact entries using applyBatch is slow

【讨论】:

  • 这些也将由 Google 同步适配器为 ContactsContract 添加到 ContactsProvider(使用批处理)。那里没有真正的速度提升。
  • @Jens,速度的提升在于开发求解时间,生成大型 CSV 很简单,google 制作的同步算法应该是最佳的。
  • 但是,他的问题涉及“code workt (sic) to slow” - 而且,如他粘贴的示例所示 - 他已经拥有将新联系人插入任意帐户所需的ContentProviderOperations。 google 的同步操作很可能是增量同步 - 即自上次同步以来发生的变化,即 充其量与他尝试执行的操作相同,但增加了 HTTP、协议和解析的开销。跨度>
  • 添加了类似问题的链接,这些问题应该给出一些提示如何在代码中做到这一点。
  • 嗯,ICS 中的 bulkInsert 比批次有更严格的限制 - 即它会更频繁地产生。您可能最好尝试在后台执行大小合理的 applyBatches(max 500 个操作)。为什么您需要在通讯录中填写大量可笑的联系人?测试目的?
猜你喜欢
  • 1970-01-01
  • 2014-06-07
  • 2019-01-07
  • 1970-01-01
  • 1970-01-01
  • 2014-09-10
  • 1970-01-01
  • 1970-01-01
  • 2015-11-26
相关资源
最近更新 更多