ContentProviderOperation

来源:互联网 发布:期货盈利交易系统优化 编辑:程序博客网 时间:2024/06/06 18:26

一、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<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());  }  
  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(ArrayList<ContentProviderOperation>operations)              throwsOperationApplicationException{            SQLiteDatabasedb = mOpenHelper.getWritableDatabase();            db.beginTransaction();//开始事务            try{                     ContentProviderResult[]  results = super.applyBatch(operations);                     db.setTransactionSuccessful();//设置事务标记为successful                     returnresults;            }finally {                     db.endTransaction();//结束事务            }  }  
1 0
原创粉丝点击