一、contentProviderOperation 批量处理方式
newInsert 插入
newUpdate 更新
newDelete 删除
withSelection (String selection, String[] selectionArgs) 指定需要操作的数据条件。只有在更新、删除操作中有用。
withValue (String key, Object value) 定义一列的数据值。只在更新、插入数据中有用。
withValues (ContentValues values) 定义多列的数据值。 只在更新、插入数据中有用。
withValueBackReference();
withYieldAllowed(true) 网上copy的解释
批量操作一大堆数据可能会长期锁定数据库,从而阻止其他应用访问该数据库并且有可能会引起ANR(应用无响应)对话框出现。
为了避免长期锁定数据库,只要在批量操作中添加“yield points”即可。一个yield points告诉Content Provider,
在执行下一个操作之前可以先提交当前的数据,然后通知其他应用,如果有其他应用请求数据的话,就先让其他应用操作,
等其他应用操作完成后,再继续打开一个事务来执行下一个操作。如果没有其他程序请求数据,则一个yield points不会自动提交事务,
而是继续执行下一个批量操作。通常情况下一个同步Adapter应该在开始操作一行原数据之前添加一个yield points。
如果数据需要被其他应用使用的话,考虑在用ContentProviderOperation执行批量操作的时候添加yield points吧。
example:
- 更新
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
ops.add(
ContentProviderOperation.newUpdate("URI")
//这是更新 或删除 操作需要 selection ,插入时不需要这个不加这个方法就好
.withSelection( "id =?", new String[] { String.valueOf(1) })
.withValue("name", "ll")
.withValue("age", "12")
.withYieldAllowed(true)
.build());
ContentProviderResult rs[] = getContext().getContentResolver()
.applyBatch(ContactsContract.AUTHORITY, ops);
for (ContentProviderResult s : rs) {
System.out.println(s.toString());
}
- 插入操作,(假如需要插入多个表,且表之间的数据有关联关系)
现在的操作是批量数据插入2个表
插入A表
ops.add(
ContentProviderOperation.newInsert("URI_A")
.withValue(RawContacts.ACCOUNT_NAME, "someAccountName")
.withYieldAllowed(true)
.build());
插入B 表时候,B 表中需要存储 A表的id 到B 表的A_id 字段,形成关联
ops.add(
ContentProviderOperation.newInsert("URI_B")
.withValueBackReference("A_id", 0)
.withValue(RawContacts.ACCOUNT_NAME, "someAccountName")
.withYieldAllowed(true)
.build());
所以需要通过withValueBackReference来建立关系:withValueBackReference (, 0)中的0就是results[0]中返回对应的A 0的id
二、对批量操作添加事物
// sqlte 事物示例
SQLiteDatabase db =mOpenHelper.getWritableDatabase();
db.beginTransaction();//开始事务
//进行insertdelete update等数据库操作
db.setTransactionSuccessful();//设置事务标记为Successful
db.endTransaction();//提交事务
//对 contentProviderOperation 复写
@Override
publicContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation>operations)
throwsOperationApplicationException{
SQLiteDatabasedb = mOpenHelper.getWritableDatabase();
db.beginTransaction();//开始事务
try{
ContentProviderResult[] results = super.applyBatch(operations);
db.setTransactionSuccessful();//设置事务标记为successful
returnresults;
}finally {
db.endTransaction();//结束事务
}
}