標籤:
ContentProvider提供資料
在Android中,他的每個應用都是相互獨立的,各自運行在自己的Dalvik虛擬機器中,但現實使用中常常需要在多個應用之間進行資料交換,例如發簡訊需要擷取連絡人中的內容,QQ上傳頭像需要擷取相簿內容等等,Android為這種跨應用的資料交換提供了一個標準ContentProvider,使用者實現自己的ContentProvider時,需要實現他規定的抽象方法:
public boolean onCreate():該方法在ContentProvider建立後會被調用,當其他應用第一次訪問ContentProvider時,該ContentProvider會被建立出來,並立即回調該onCreate()方法。
public Uri inert(Uri uri,ContentValues values):根據該Uri插入values對應的資料。
public int delete(Uri uri,String selection,String[] selectionArgs):根據Uri刪除select條件所匹配的全部記錄。
public int update(Uri uri,ContentValues values ,String selection,String[] selectionArgs):根據Uri修改select條件所匹配的全部記錄
public Cursor query(Uri uri ,String[] projection,String selection ,String[] selectionArgs,String sortOrder):根據Uri查詢出select條件所匹配的全部記錄,其中projection就是列明列表,表明只選擇出指定的資料列。
public String getTypt(Uri uri):該方法用於返回當前Uri所代表的資料的MIME類型,如果該Uri對應資料可能包括多條資料,那麼MIME類型字串應該以vnd.android.cursor.dir/開頭,如果該Uri對應的資料只包含一條記錄,那麼返回MIME類型字串應該以vnd.android.cursor.item/開頭。
什麼是URI
上面每個方法都有一個Uri參數,那麼Uri又是什麼呢?
關於Uri的可以參考這兩篇博文 http://www.cnblogs.com/gaojing/archive/2012/02/04/2413626.html
http://www.cnblogs.com/hust-ghtao/p/4724885.html
就以上面兩個網址來說:
http://這個是URL的協議部分,只要通過http協議來訪問網站,前面都是這個首碼。
www.cnblogs.com這個是網域名稱,訪問指定的網站,網域名稱部分也是不變的
gaojing/archive/2012/02/04/2413626.html和hust-ghtao/p/4724885.html這個就是網站資源部分,這個是動態改編的,訪問者訪問不同的資源,這個部分也會不同。
ContentProvider要求的Uri和URL類似,例如
content://org.crazyit.providers.dictprovider/words
content://這個是android的contentprovider規定的,就像http://一樣,提供ContentProvider和訪問ContentProvider的預設協議就是content://
org.crazyit.providers.dictprovider這個類似於網址,系統通過這個名字找到你要操作哪個ContentProvider。
words這個是資源部分,訪問者訪問不同的資源時候,這裡也是動態改變的。
可以使用Uri的靜態方法parse()將字串轉換成一個Uri。
ContentResolver訪問使用
通常與ContentProvider結合使用的是ContentResolver,一個應用程式使用ContentProvider提供資料,另外一個應用程式使用ContentResolver來訪問資料。
可以使用Context的getContentResolver()方法來擷取ContentProvider對象
獲得了ContentResolver對象之後,可以使用如下方法操作資料:
insert(Uri uri,ContentValues values):向Uri對應的ContentProvider中插入values對應的資料。
delete(Uri uri,String where,String[] selectionArgs):刪除Uri對應的ContentProvider中where提交匹配的資料。
update(Uri uri,ContentValues values,String where ,String[] selectionArgs):更新Uri對應的ContentProvider中where提交匹配的資料。
query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder):查詢Uri對應的ContentProvider中where提交匹配的資料。
一般來說,ContentProvider是單例模式,當多個應用程式通過ContentResolver來操作ContentProvider提供的資料時,ContentResolver調用的資料操作將會委託給同一個ContentProvider處理。
註冊ContentProvider
在定義好ContentProvider之後,還需要在系統中註冊這個ContentProvider,具體操作方法是在AndroidMainifest.xml檔案中添加一個<provider>元素,需要注意的是,我們要設定這個元素的exported的值為true,表明這個ContentProvider可以向外部應用提供資料
Android筆記(五十四) Android四大組件之一——ContentProvider(一)