ContentProviderOperation

一、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:

  1. 更新
ArrayList ops = new ArrayList();


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());  
}  
  1. 插入操作,(假如需要插入多个表,且表之间的数据有关联关系)

现在的操作是批量数据插入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(ArrayListoperations)  
            throwsOperationApplicationException{  
          SQLiteDatabasedb = mOpenHelper.getWritableDatabase();  
          db.beginTransaction();//开始事务  
          try{  
                   ContentProviderResult[]  results = super.applyBatch(operations);  
                   db.setTransactionSuccessful();//设置事务标记为successful  
                   returnresults;  
          }finally {  
                   db.endTransaction();//结束事务  
          }  
}  

你可能感兴趣的:(sql)