使用 ContentProviderOperation 來提高性能

ContentProviders  是android 系統核心組件之一,ContentProviders 封裝了數據的訪問接口,其底層數據通常都是保存在數據庫中或者保存在雲端。html

有時候你須要更新多行數據,能夠選擇調用屢次ContentResolver的對應函數,或者 使用批量操做。固然 後者性能會比較好些。java

爲了使批量更新、插入、刪除數據更加方便,android系統引入了 ContentProviderOperation類。android

在官方開發文檔中推薦使用ContentProviderOperations,有一下緣由:數據庫

  1. 全部的操做都在一個事務中執行,這樣能夠保證數據完整性
  2. 因爲批量操做在一個事務中執行,只須要打開和關閉一個事務,比屢次打開關閉多個事務性能要好些
  3. 使用批量操做和屢次單個操做相比,減小了應用和content provider之間的上下文切換,這樣也會提高應用的性能,而且減小佔用CPU的時間,固然也會減小電量的消耗。


要建立ContentProviderOperation對象,則須要使用 ContentProviderOperation.Builder類,經過調用下面幾個靜態函數來獲取一個Builder 對象:
設計模式

獲取Builder 對象的函數
函數 用途
newInsert 建立一個用於執行插入操做的Builder
newUpdate 建立一個用於執行更新操做的Builder
newDelete 建立一個用於執行刪除操做的Builder

這個Buidler對象使用了著名的Builder設計模式。app

因爲Builder對象的函數都返回了本身,因此經過一系列的函數調用便可生成最終的ContentProviderOperation對象。ide

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。ui

最後經過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

相關文章
相關標籤/搜索