使用 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對象。

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()函數來應用批量操作:

try {
   getContentResolver().
      applyBatch(ContactsContract.AUTHORITY, ops);
} catch (RemoteException e) {
   // do s.th.
} catch (OperationApplicationException e) {
   // do s.th.
}

批量操作很簡單,提示性能很容易!

如果您還沒有使用ContentProviderOperation,趕緊修改吧!



Read more: http://blog.chengyunfeng.com/?p=517#ixzz3CzcGjshp


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM