使用 ContentProviderOperation 来提升性能
2015-10-29 10:33
465 查看
使用 ContentProviderOperation 来提升性能
ContentProviders 是android 系统核心组件之一,ContentProviders 封装了数据的访问接口,其底层数据一般都是保存在数据库中或者保存在云端。因为Builder设计模式设计模式是将数据直接封装到
ContentProviderOperation里面,然后添加到定义好的
ArrayList<ContentProviderOperation>()集合中,可以实现批量操作,
具体怎样批量操作示例,提升性能。而
ContentResolver的对应函数只能调用多次,比较耗时
。
为了使批量更新、插入、删除数据更加方便,android系统引入了
ContentProviderOperation类。
在官方开发文档中推荐使用
ContentProviderOperations,有一下原因:
所有的操作都在一个事务中执行,这样可以保证数据完整性
由于批量操作在一个事务中执行,只需要打开和关闭一个事务,比多次打开关闭多个事务性能要好些
使用批量操作和多次单个操作相比,减少了应用和content provider之间的上下文切换,这样也会提升应用的性能,并且减少占用CPU的时间,当然也会减少电量的消耗。
要创建
ContentProviderOperation对象,则需要使用ContentProviderOperation.Builder类,通过调用下面几个静态函数来获取一个Builder 对象:
函数 | 用途 |
---|---|
newInsert | 创建一个用于执行插入操作的Builder |
newUpdate | 创建一个用于执行更新操作的Builder |
newDelete | 创建一个用于执行删除操作的Builder |
由于Builder对象的函数都返回了自己,所以通过一系列的函数调用即可生成最终的ContentProviderOperation对象。
下表是Builder对象核心函数的介绍:
函数 | 用途 |
---|---|
withSelection (String selection, String[] selectionArgs) | 指定需要操作的数据条件。只有在更新、删除操作中有用。 |
withValue (String key, Object value) | 定义一列的数据值。只在更新、插入数据中有用。 |
withValues (ContentValues values) | 定义多列的数据值。 只在更新、插入数据中有用。 |
withValueBackReference()函数作用的时候就知道为啥用有序的ArrayList而不是其他List。
最后通过ContentResolver 的applyBatch()函数来应用批量操作:
示例:
package com.example.contactdemos.test;
import java.util.ArrayList;
import android.content.ContentProviderOperation;
import android.content.ContentProviderResult;
import android.content.OperationApplicationException;
import android.os.RemoteException;
import android.provider.ContactsContract;
import android.test.AndroidTestCase;
public class ContactsTest extends AndroidTestCase {
/**
* 根据主键ID更新
*/
public void updateByData_ID() {
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
// 把与这个display_name关联的data2,data3,data5清空,主要是保证(raw_contacts表中的display_name的正确性)
ContentProviderOperation operation = ContentProviderOperation
.newUpdate(ContactsContract.Data.CONTENT_URI)
.withSelection(ContactsContract.Data._ID + "=?",
new String[] { String.valueOf(1) })
.withValue(
ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME,// 对应data表中的data2字段
null)
.withValue(
ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME,// 对应data表中的data3字段
null)
.withValue(
ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME,// 对应data表中的data5字段
null)
.withValue(
ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,// 对应data表中的data1字段
"陈红军").build();
ops.add(operation);
try {
ContentProviderResult rs[] = getContext().getContentResolver()
.applyBatch(ContactsContract.AUTHORITY, ops);
for (ContentProviderResult s : rs) {
System.out.println(s.toString());
}
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (OperationApplicationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 根据raw_contact_id和mimetype更新的操作
*/
public void updateByRawContactIdAndMimeType() {
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
// 把与这个display_name关联的data2,data3,data5清空,主要是保证(raw_contacts表中的display_name的正确性)
ContentProviderOperation operation = ContentProviderOperation
.newUpdate(ContactsContract.Data.CONTENT_URI)
.withSelection(
ContactsContract.Data.RAW_CONTACT_ID + "=?" + " AND "
+ ContactsContract.Data.MIMETYPE + "=?",
new String[] {
String.valueOf(1),
ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE })
.withValue(
ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, // 对应data表中的data2字段
null)
.withValue(
ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, // 对应data表中的data3字段
null)
.withValue(
ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME,// 对应data表中的data5字段
null)
.withValue(
ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,// 对应data表中的data1字段
"夏淑琼").build();
ops.add(operation);
try {
ContentProviderResult rs[] = getContext().getContentResolver()
.applyBatch(ContactsContract.AUTHORITY, ops);
for (ContentProviderResult s : rs) {
System.out.println(s.toString());
}
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (OperationApplicationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
相关文章推荐
- 网站广告收入反正要发动群众的力量,来创造利润--小黄人软件
- ecshop重写url地址
- 10月27日全球域名商解析量TOP21:易名中国升至十三
- 解决linux下内网域名的ping结果和nslookup结果不一致
- 10月27日中国域名商解析量TOP14:万网蝉联冠军
- Shell 同时读取多个文件
- maven scope含义的说明
- JSP网站
- .xyz域名总量TOP10:新网负增长 阿里云跌至第六
- maven依赖关系中Scope的作用
- Shell统计
- nginx 编译 问题
- 文章标题
- 第1讲 Hadoop生态系统以及版本演化
- hadoop2整体架构
- 如何让我的电脑监控我手机的请求
- linux常见问题集锦-2
- cdh hadoop2集群安装
- cdh hadoop2单机安装
- 在使用Myeclipse时,用Tomcat添加部署项目的时候报错,或启动tomcat报错