android中的ContentProvider实现数据共享
為了在應用程序之間交換數據,android中提供了ContentProvider,ContentProvider是不同應用程序之間進行數據交換的標準API。當一個應用程序需要把自己的數據暴露給其他程序使用時,該應用程序可以通過提供contentProvider來實現,其他應用程序可通過ContentResolver來操作ContentProvider暴露的數據。
?
ContentProvider是android應用中的四大組件之一,使用時需要在AndroidManifest.xml文件中進行配置。
一旦某個應用程序通過ContentProvider暴露了自己的數據操作接口,那么不管該應用程序是否啟動,其他的應用程序都可以通過該操作接口來操作程序內部的數據,包括增刪改查。
?
ContentProvider是不同應用程序之間進行數據交換的標準API,ContentProvider以某種Uri的形式對外提供數據,允許其他的應用訪問或者修改數據。其他的應用程序使用ContentResolver根據Uri去訪問操作指定的數據。
?
開發一個ContentProvider的步驟:
1、定義自己的ContentProvider類,該類要繼承android提供的ContentProvider基類
2、在AndroidManifest.xml清單文件中對ContentProvider進行注冊
<provider android:name=".TestProvider" android:authorities="com.test.testProvider"/>
自定義的ContentProvider類繼承android中提供的ContentProvider基類后還需要實現下面幾個方法才能實現對外暴露數據:
onCreate() :該方法在ContentProvider創建后被調用,,當其他的應用程序第一次訪問ContentProvider時,該contentProvider會被創建出來,并立即調用該onCreate()方法。適合做初始化。
query(Uri uri, String[] projection, String selection, ???String[] selectionArgs, String sortOrder) :根據Uri查詢滿足selection條件的數據,其中projection是列名列表,表明只選擇指定的數據列。
getType(Uri uri):返回Uri多代表的數據的MIME類型。如果Uri對應的數據包括多條記錄,那么MIME類型的字符串應該返回以vnd.android.cursor.dir/開頭,如果是一條數據那么返回的MIME字符串應該以vnd.android.cursor.item/開頭
insert(Uri uri, ContentValues values) :根據Uri插入values對應的額數據
delete(Uri uri, String selection, String[] selectionArgs) :根據Uri刪除和selection條件匹配的數據
update(Uri uri, ContentValues values, String selection, ???String[] selectionArgs) :根據Uri更新匹配條件的數據
?
Uri介紹
?android中的Uri:
content://com.test.testProvider/words
Uri分為三部分:
content:// : 這個部分是android所規定的的,是固定寫法。
com.test.testProvider :這個部分是ContentProvider的authorities(),系統就是由這個部分找到需要操作那個ContentProvider。只要訪問指定的ContentProvider,這個部分是固定的。
words:資源部分,當訪問不同的資源時,這個部分是動態改變的。
android中Uri的豐富功能:
content://com.test.testProvider/word/2
此時他要訪問的資源為word/2,代表訪問word數據中ID為2的記錄
content://com.test.testProvider/word/2/word
此時他要訪問的資源為word/2,這意味著訪問word數據中ID為2的記錄的word字段
content://com.test.testProvider/words?? //訪問全部的數據
?
數據為XML格式的Uri
content://com.test.testProvider/word/detail/
代表訪問word節點下的detail節點
?
android中將字符串轉化為Uri的工具類Uri:
Uri uri = Uri.parse("content://com.test.testProvider/word/2/word");?
ContentResolver操作數據:
Context提供了如下的方法來獲取ContentResolver對象:getContentResolver()
ContentResolver提供如下的方法操作數據:
insert(Uri url, ContentValues values):向Uri對應的ContentProvider中插入values數據
delete(Uri url, 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是單例模式的,當多個應用程序通過ConentResolver來操作ContentProvider提供的數據時,ConentResolver調用的數據操作都將會委托給同一個ContentProvider處理。
?
為了確定ContentProvider實際能匹配的Uri,以及確定每個方法中Uri參數所操作的數據,android中提供了UriMatcher工具類:
addURI(String authority, String path, int code):該方法用于向UriMatcher對象注冊Uri,其中authority和path組合成一個Uri,code則代表該Uri對應的標識碼。
match(Uri uri):根據前面注冊的Uri來判斷指定的Uri對應的標示碼,如果找不到匹配標識碼則返回-1。
UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); matcher.addURI("com.test.testProvider", "words", 1); matcher.addURI("com.test.testProvider", "word/#", 2);上面的#位通配符
// 返回1 matcher.match(Uri.parse("content://com.test.testProvider/words")); // 返回2 matcher.match(Uri.parse("content://com.test.testProvider/word/2")); // 返回2 matcher.match(Uri.parse("content://com.test.testProvider/word/22"));
android中還提供了一個ContentUris工具類,用于操作Uri字符串:
Uri withAppendedId(Uri contentUri, long id):添加id部分
parseId(Uri contentUri):解析出包含id
?
監聽ContentProvider的數據變化:
ContentObserver:當ContentProvider中的數據改變時調用如下的代碼
getContext().getContentResolver().notifyChange(uri, null);這行代碼用于通知所有注冊在該Uri上的監聽者:該ContentProvider所共享的數據發生了改變
為了監聽ContentProvider數據的改變,需要利用android中提供的ContentObserver基類。監聽ContentProvider數據改變的監聽器需要繼承ContentObserver類,并重寫該基類所定義的onChange(boolean selfChange)方法——當他所監聽的ContentProvider的數據發生改變時,該onChange將會被調用。為了監聽ContentProvider的數據變化,需要通過ContentResolver向指定的Uri注冊ContentObserver監聽器。ContentResolver提供如下的方法來注冊監聽器:
registerContentObserver(Uri uri, boolean notifyForDescendents,ContentObserver observer)uri:該監聽器所監聽的ContentProvider的Uri
notifyForDescendents:如果該參數為true,假如監聽的Uri為content://abc,那么Uri為content://abc/xyz、content://abc/xyz/foo的數據改變也會觸發該監聽器,如果為false,那么只有Uri為content://abc的數據發生了變化才會觸發該監聽器。
?
getContentResolver().registerContentObserver(uri, notifyForDescendents, observer)?
?
?
?
?
?
轉載于:https://www.cnblogs.com/heml/p/3569452.html
總結
以上是生活随笔為你收集整理的android中的ContentProvider实现数据共享的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第2天:汇编语言与Makefile
- 下一篇: 触发器的创建、修改和删除