关于ContentProvider的批量操作

  今天看公司代码,发现在批量插入通话记录和联系人的时候,用了一个

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

  这是一个批量插入的列表。

ops.add(ContentProviderOperation
                        .newInsert(ContactsContract.RawContacts.CONTENT_URI)
                        .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE,
                                null)
                        .withValue(ContactsContract.RawContacts.ACCOUNT_NAME,
                                null).withYieldAllowed(true).build());
                ops.add(ContentProviderOperation
                        .newInsert(ContactsContract.Data.CONTENT_URI)
                        .withValueBackReference(
                                ContactsContract.Data.RAW_CONTACT_ID,
                                rawContactInsertIndex)
                        .withValue(
                                ContactsContract.Data.MIMETYPE,
                                ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
                        .withValue(
                                ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,
                                name).withYieldAllowed(true).build());

  然后调用内容提供者来执行批量操作。

resolver.applyBatch(ContactsContract.AUTHORITY, ops);
                        ops.clear();

  这样做相比一次次的迭代循环操作,有一些性能上的优势。

  因为,这样是一个事物,保证数据完整性,而且减少了上下文的切换。具体的用法见代码。常量的话,替换成自己需要的就可以了。不过这主要针对有Content Provider的才能做,如果是是对数据库的操作,那就直接对数据库操作可能更直接些。

posted @ 2016-03-01 11:47  likeshu  阅读(1284)  评论(0编辑  收藏  举报