【问题标题】:Add several contacts in batch批量添加多个联系人
【发布时间】:2011-10-30 16:43:49
【问题描述】:

我完全可以使用以下代码一一添加联系人:

    ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();

    ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
            .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
            .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null).build());

    ops.add(ContentProviderOperation
            .newInsert(Data.CONTENT_URI)
            .withValueBackReference(Data.RAW_CONTACT_ID, 0)
            .withValue(Data.MIMETYPE,
                    CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
                    .withValue(StructuredName.GIVEN_NAME, "Hello")
                    .withValue(StructuredName.FAMILY_NAME, "World").build());

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

但是,当我尝试一个一个地添加大约 500 个联系人时 - 这需要几分钟,这对我的应用程序来说太长了。添加多个联系人有更快的方法吗?

【问题讨论】:

  • 您可以将它们添加到线程中 - 而不是 UI 线程。
  • 我在单独的线程中做,问题是操作本身需要太多时间。在 iPhone 中,500 个联系人需要几秒钟。
  • 我以类似的方式执行此操作,但是每次我想添加联系人时都会执行批处理。我不认为这是正确的方法,但它似乎工作正常
  • 好吧,如果 iPhone 运行几秒钟,而 Android 运行几分钟,我倾向于认为我使用了错误的 API。
  • 退出使用 ApplyBatch() 并开始使用 [BulkInsert()][1]。 [1]:stackoverflow.com/questions/5596354/…

标签: java android contacts android-contentprovider


【解决方案1】:

为什么不将arraylist 设为一个可以从任何活动中访问的全局列表,我不会在Bundle 中插入那么多内容,因为当你这样做时还会发生更多事情,它只是为了传递少量信息。我会这样做,确保在清单中也调用它..

public class MyStates extends Application {

    private  ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();

    public ArrayList getList() {
    return this.blueToothAdapter;
    }

    public void setList(ArrayList<ContentProviderOperation> o) {
        this.ops= o;
    }

【讨论】:

  • 这与我的问题有什么关系?
  • 这是一个合法的答案,而不是使用 Bundle 来传递大量数据,而是创建一个可供所有活动访问的全局数组。
  • 我在活动之间传递数据没有问题。我遇到了缓慢的联系人 API 问题。
  • 是的,我知道,但您正试图一步完成这么多……如何隔离慢的?我在想也许大型捆绑包的创建和传递给每个活动的速度很慢,因此是一个数组的全局创建。如果不是这样,那么在传递包之前,在后台进程中线程检索联系人。
【解决方案2】:

您可以使用与您使用相同的功能在一次批量操作中添加多个联系人,只需稍作修改即可。

您可以在单个批处理操作中添加多达 500 个操作,您可以继续在 Data Uri 操作中包含反向引用以及 raw_contacts 插入操作的相应索引。

【讨论】:

  • 你能扩展这个答案吗,有什么小的修改?我遇到了类似的问题,但是循环遍历代码似乎会导致添加(未知)联系人。 link
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-15
  • 1970-01-01
  • 2014-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多