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:
- 更新
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();//结束事务 } }
- ContentProviderOperation
- ContentProvider中的ContentProviderOperation使用方法
- 使用 ContentProviderOperation 来提升性能
- 使用 ContentProviderOperation 来提升性能
- 使用 ContentProviderOperation 来提升性能
- 使用 ContentProviderOperation 来提升性能
- ContentProviderOperation批量操作提升性能
- 使用ContentProviderOperation 来提升应用性能
- 11_android系统联系人(更新用户名称为例)介绍ContentProviderOperation的使用
- 聚合数据---(手机充值)iOS SDK V2.0 简易开发指南
- android 控件各种颜色的半透明效果配置
- [生存志] 第69节 孙武吴宫授兵法
- linux-cenos6.5下升级git到最新的版本
- angular2 (v2.0)
- ContentProviderOperation
- Windiows下配置React Native开发环境(一)
- 在Eclipse中使用git把项目导入到osc@git中
- iOS开发中的WKWebView与JS的交互
- php+ajax+mysql用异步获取方法实现后台数据显示在前端并获取正文数据和完成上下分页
- Android webview 加载https网页显示空白
- [Web前端技术教学]利用行内CSS技术对CSDN博客的细致美化
- 15.利用Fsync锁备份,数据修复
- HBase region预拆分