批量操作需要使用事务以节省时间
同一类型的数据库操作, 每一次操作都去打开关闭数据库会比较耗时, 此时使用事务的方式去操作数据库, 会将操作暂时缓存起来, 在最后执行时只需要打开一次数据库, 会大大的减少操作时间
新建一个列表存操作
1 |
ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>(); |
存入操作
一个 ContentProviderOperation 代表一个插入操作
ContentProviderOperation 的方法
静态方法:(返回ContentProviderOperation.Builder对象)
- newDelete(Uri uri)
- newInsert(Uri uri)
- newUpdate(Uri uri)
- newAssertQuery(Uri uri)
ContentProviderOperation.Builder 的方法
- withSelection(String selection, String[] selectionArgs)
-
withValueBackReference(String key, int previousResult)
批量操作列表中第 previousResult 个操作的返回值作为该 key 的值 (适用 insert, update, or assert)
-
withValue(String key, Object value)
A value to insert or update
-
withYieldAllowed(boolean yieldAllowed)
是否允许其它事务同时操作数据库
-
build() 末尾调用返回 ContentProviderOperation 对象, 存入列表
执行操作
getContentResolver().applyBatch(String authority, ArrayList
第一个参数实现事务的Provider的authority属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
public static void addContactToSQL(String name, List<Map<String, String>> list, String id) throws Exception { ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>(); ContentProviderOperation operation = ContentProviderOperation .newInsert(ContactsContract.RawContacts.CONTENT_URI) .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null) .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null) .build(); operations.add(operation); // 添加联系人名称操作 operation = 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(); operations.add(operation); int size2 = list.size(); for (int x = 0; x < size2; x++) { // 向联系人电话号码URI添加电话号码 operation = 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.TYPE, getClassString(list.get(size2 - 1 - x).get("num") .substring(0, 1))) .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, list.get(size2 - 1 - x).get("num").substring(1)) .build(); operations.add(operation); } ContentResolver resolver = BtApp.getmContext().getContentResolver(); // 批量执行,返回执行结果集 ContentProviderResult[] results = resolver.applyBatch( ContactsContract.AUTHORITY, operations); } |
第二种方法(只记录, 未验证)
1 2 3 4 5 6 7 8 9 10 11 |
SQLiteDatabase db ... ; //开启事务 db.beginTransaction() .... //数据库操作 .... //设置事务标志为成功,当结束事务时就会提交事务 db.setTransactionSuccessful(); //结束事务, 执行数据库操作 db.endTransaction(); |
0 Comments