使用 ContentProviderOperation 来提升性能
来源:互联网 发布:windows视频剪辑 编辑:程序博客网 时间:2024/05/12 21:50
使用 ContentProviderOperation 来提升性能
ContentProviders 是android 系统核心组件之一,ContentProviders 封装了数据的访问接口,其底层数据一般都是保存在数据库中或者保存在云端。
因为Builder设计模式设计模式是将数据直接封装到ContentProviderOperation
里面,然后添加到定义好的ArrayList<ContentProviderOperation>()
集合中,可以实现批量操作,具体怎样批量操作示例
,提升性能。而ContentResolver的对应函数
只能调用多次,比较耗时。
为了使批量更新、插入、删除数据更加方便,android系统引入了
ContentProviderOperation
类。
在官方开发文档中推荐使用ContentProviderOperations,有一下原因:
- 所有的操作都在一个事务中执行,这样可以保证数据完整性
- 由于批量操作在一个事务中执行,只需要打开和关闭一个事务,比多次打开关闭多个事务性能要好些
- 使用批量操作和多次单个操作相比,减少了应用和content provider之间的上下文切换,这样也会提升应用的性能,并且减少占用CPU的时间,当然也会减少电量的消耗。
要创建ContentProviderOperation对象,则需要使用
ContentProviderOperation.Builder类,通过调用下面几个静态函数来获取一个Builder 对象:
这个Buidler对象使用了著名的Builder设计模式。
由于Builder对象的函数都返回了自己,所以通过一系列的函数调用即可生成最终的ContentProviderOperation对象。
ArrayList<ContentProviderOperation> ops =
new
ArrayList<ContentProviderOperation>();
ops.add(
ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
.withValue(RawContacts.ACCOUNT_TYPE,
"someAccountType"
)
.withValue(RawContacts.ACCOUNT_NAME,
"someAccountName"
)
.withYieldAllowed(
true
)
.build());
当然 你还可以使用熟悉的ContentValues对象,对应的函数为withValues(values)。
下表是Builder对象核心函数的介绍:
另外注意上面示例代码中是使用ArrayList来保存
ContentProviderOperation操作的。后面在介绍withValueBackReference()函数作用的时候就知道为啥用
有序的ArrayList而不是其他List。
最后通过ContentResolver 的applyBatch()函数来应用批量操作:
try
{
getContentResolver().
applyBatch(ContactsContract.AUTHORITY, ops);
}
catch
(RemoteException e) {
// do s.th.
}
catch
(OperationApplicationException e) {
// do s.th.
}
批量操作很简单,提示性能很容易!
示例:
- 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();
- }
- }
- }
- 使用 ContentProviderOperation 来提升性能
- 使用 ContentProviderOperation 来提升性能
- 使用 ContentProviderOperation 来提升性能
- 使用 ContentProviderOperation 来提升性能
- 使用ContentProviderOperation 来提升应用性能
- ContentProviderOperation批量操作提升性能
- ContentProviderOperation
- Android Training - 提升布局文件的性能(Lesson 4 - 使用ViewHolder来提升ListView的性能)
- 使用Redis+TCMalloc组合来提升服务器性能
- 使用局部索引来提升 PostgreSQL 的性能
- 使用combiner提升性能
- 使用sendfile提升性能
- 使用NIO提升性能
- 利用stringbuilder来提升字符串的性能
- 利用函数节流来提升性能
- 使用FlashFXP来提升权限
- 使用FlashFXP来提升权限
- 使用FlashFXP来提升权限
- Android四大组件之Service(服务)
- [Windows] VMware Workstation 12.0.0 Pro 正式版/注册码/注册机
- Java实现常见的7种排序算法
- JVM执行Java程序的过程中管理的内存空间
- 用HttpListener 建立web服务器 实现网页浏览、文件上传
- 使用 ContentProviderOperation 来提升性能
- ALM中action使用,包括多action复用
- SVM算法
- linux下hadoop2.6.1源码64位的编译
- textview属性
- django.contrib.auth.backend-后台
- Android自定义view学习笔记01
- Android Drawable各种定义方式
- android 内存清理