ContentProviderOperation

本文介绍如何使用ContentProviderOperation进行批量数据操作,包括插入、更新和删除,并解释了如何使用withYieldAllowed避免长时间锁定数据库导致的ANR问题,以及如何在批量操作中添加事务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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();//结束事务  
          }  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李磊LL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值