標籤:android blog http io os 使用 ar java 資料
ContentProviders 是android 系統核心組件之一,ContentProviders 封裝了資料的提供者,其底層資料一般都是儲存在資料庫中或者儲存在雲端。
有時候你需要更新多行資料,可以選擇調用多次ContentResolver的對應函數,或者 使用大量操作。當然 後者效能會比較好些。
為了使批次更新、插入、刪除資料更加方便,android系統引入了 ContentProviderOperation類。
在官方開發文檔中推薦使用ContentProviderOperations,有一下原因:
- 所有的操作都在一個事務中執行,這樣可以保證資料完整性
- 由於大量操作在一個事務中執行,只需要開啟和關閉一個事務,比多次開啟關閉多個事務效能要好些
- 使用大量操作和多次單個操作相比,減少了應用和content provider之間的環境切換,這樣也會提升應用的效能,並且減少佔用CPU的時間,當然也會減少電量的消耗。
要建立ContentProviderOperation對象,則需要使用 ContentProviderOperation.Builder類,通過調用下面幾個靜態函數來擷取一個Builder 對象:
擷取Builder 對象的函數
| 函數 |
用途 |
| newInsert |
建立一個用於執行插入操作的Builder |
| newUpdate |
建立一個用於執行更新操作的Builder |
| newDelete |
建立一個用於執行刪除操作的Builder |
這個Buidler對象使用了著名的Builder設計模式。
由於Builder對象的函數都返回了自己,所以通過一系列的函數調用即可產生最終的ContentProviderOperation對象。
| 12345678 |
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()函數來應用大量操作:
| 12345678 |
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
使用 ContentProviderOperation 來提升效能