日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

android中的ContentProvider实现数据共享

發布時間:2023/12/9 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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实现数据共享的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。