ContentProviders 是android 系統核心組件之一,ContentProviders 封裝了數據的訪問接口,其底層數據一般都是保存在數據庫中或者保存在雲端。
有時候你需要更新多行數據,可以選擇調用多次ContentResolver的對應函數,或者 使用批量操作。當然 后者性能會比較好些。
為了使批量更新、插入、刪除數據更加方便,android系統引入了 ContentProviderOperation類。
在官方開發文檔中推薦使用ContentProviderOperations,有一下原因:
- 所有的操作都在一個事務中執行,這樣可以保證數據完整性
- 由於批量操作在一個事務中執行,只需要打開和關閉一個事務,比多次打開關閉多個事務性能要好些
- 使用批量操作和多次單個操作相比,減少了應用和content provider之間的上下文切換,這樣也會提升應用的性能,並且減少占用CPU的時間,當然也會減少電量的消耗。
要創建ContentProviderOperation對象,則需要使用 ContentProviderOperation.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對象核心函數的介紹:
| 函數 | 用途 |
|---|---|
| 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
