• 使用 ContentProviderOperation 来提升性能


    ContentProviders  是android 系统核心组件之一,ContentProviders 封装了数据的访问接口,其底层数据一般都是保存在数据库中或者保存在云端。

    有时候你需要更新多行数据,可以选择调用多次ContentResolver的对应函数,或者 使用批量操作。当然 后者性能会比较好些。

    为了使批量更新、插入、删除数据更加方便,android系统引入了 ContentProviderOperation类。

    在官方开发文档中推荐使用ContentProviderOperations,有一下原因:

    1. 所有的操作都在一个事务中执行,这样可以保证数据完整性
    2. 由于批量操作在一个事务中执行,只需要打开和关闭一个事务,比多次打开关闭多个事务性能要好些
    3. 使用批量操作和多次单个操作相比,减少了应用和content provider之间的上下文切换,这样也会提升应用的性能,并且减少占用CPU的时间,当然也会减少电量的消耗。


    要创建ContentProviderOperation对象,则需要使用 ContentProviderOperation.Builder类,通过调用下面几个静态函数来获取一个Builder 对象:

    获取Builder 对象的函数
    函数用途
    newInsert 创建一个用于执行插入操作的Builder
    newUpdate 创建一个用于执行更新操作的Builder
    newDelete 创建一个用于执行删除操作的Builder

    这个Buidler对象使用了著名的Builder设计模式。

    由于Builder对象的函数都返回了自己,所以通过一系列的函数调用即可生成最终的ContentProviderOperation对象。

    1
    2
    3
    4
    5
    6
    7
    8
    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对象核心函数的介绍:

    Builder主要函数介绍
    函数用途
    withSelection (String selection, String[] selectionArgs) 指定需要操作的数据条件。只有在更新、删除操作中有用。
    withValue (String key, Object value) 定义一列的数据值。只在更新、插入数据中有用。
    withValues (ContentValues values) 定义多列的数据值。 只在更新、插入数据中有用。

    另外注意上面示例代码中是使用ArrayList来保存 ContentProviderOperation操作的。后面在介绍withValueBackReference()函数作用的时候就知道为啥用 有序的ArrayList而不是其他List。

    最后通过ContentResolver 的applyBatch()函数来应用批量操作:

    1
    2
    3
    4
    5
    6
    7
    8
    try {
       getContentResolver().
          applyBatch(ContactsContract.AUTHORITY, ops);
    } catch (RemoteException e) {
       // do s.th.
    } catch (OperationApplicationException e) {
       // do s.th.
    }

    批量操作很简单,提示性能很容易!

    如果您还没有使用ContentProviderOperation,赶紧修改吧

    http://www.cnblogs.com/tt_mc/p/3966707.html

    http://blog.csdn.net/woshinia/article/details/9024265

  • 相关阅读:
    html JS 打开本地程序及文件
    [转]jquery mobile中redirect重定向问题
    kafka中broker、producer、consumer主要配置参数说明
    手写一个LruCache
    ES发布时max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] 错误
    UML类图
    JVM调优总结
    JVM学习系列(五) 常见的JVM参数
    JVM学习系列(四) 相关概念
    JVM学习系列(三) 虚拟机监控相关
  • 原文地址:https://www.cnblogs.com/shaweng/p/4014931.html
Copyright © 2020-2023  润新知