关于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的才能做,如果是是对数据库的操作,那就直接对数据库操作可能更直接些。