Android 中ContentProvider的實(shí)例詳解
Android 中ContentProvider的實(shí)例詳解
Content Provider 的簡單介紹:
* Android中的Content Provider 機(jī)制可支持在多個(gè)應(yīng)用中存儲(chǔ)和讀取數(shù)據(jù)。這也是跨應(yīng)用
共享數(shù)據(jù)的唯一方式。在Android系統(tǒng)中,沒有一個(gè)公共的內(nèi)存區(qū)域,供多個(gè)應(yīng)用共享存儲(chǔ)數(shù)據(jù);
* Android 提供了一些主要數(shù)據(jù)類型的ContentProvider ,比如:音頻、視頻、圖片和私人通訊錄等;
在android.provider 包下面找到一些android提供的ContentProvider;可以通過獲得ContentProvider,
查詢他們包含的數(shù)據(jù)(查詢的條件是:已經(jīng)獲得適當(dāng)?shù)淖x取權(quán)限);
1、Uri的介紹:
Uri代表了要操作的數(shù)據(jù),Uri主要包含了兩部分的信息: * 需要操作的ContentProvider * 對(duì)ContentProvider 中的什么數(shù)據(jù)進(jìn)行操作; 一個(gè)Uri由下列幾個(gè)部分組成: content://cn.itcast.provider.personprovider/person/10
解析:
* content:// :scheme * cn.itcast.provider.personprovider : 主機(jī)名或anthority * person/10 : 路徑 * 10 : ID
1.1: ContentProvider(內(nèi)容提供者)的scheme 已經(jīng)由Android所規(guī)定,scheme為 content://主機(jī)名(或叫Authority)用于唯一標(biāo)識(shí)這個(gè)ContentProvider,外 部調(diào)用者可以根據(jù)這個(gè)標(biāo)識(shí)來找到它。路徑path,可以用來表示我們要操作的 數(shù)據(jù),路徑的構(gòu)建應(yīng)根據(jù)業(yè)務(wù)定,例如:
(1) 要操作person表中id為10的記錄,構(gòu)建路徑如下:/person/10;
(2) 要操作person表中id為10 的記錄的name字段:person/10/name;
(3) 要操作person表中的所有記錄: /person;
(4) 要操作xxx表中的記錄: /xxx;
(5) 如果要操作的數(shù)據(jù)部是來自數(shù)據(jù)庫,而是來自文件、xml或網(wǎng)絡(luò)等其他存儲(chǔ)方式;
例如:要操作xml文件中person節(jié)點(diǎn)下的name節(jié)點(diǎn),構(gòu)建路徑如下:/person/name
如果要把一個(gè)字符串轉(zhuǎn)換成Uri,可以使用Uri類中的parse()方法:
Uri uri = Uri.parse("content://itcast.provider.personprovider/person");
2、UriMatcher 類使用介紹:
由于Uri代表了要操作的數(shù)據(jù),所以經(jīng)常需要解析Uri,并從Uri中獲取數(shù)據(jù),Android中提供 了兩個(gè)用于操作Uri的工具類:
* UriMatcher
* ContentUris
UriMatcher 類,用于匹配Uri,用法如下:
/* UriMathcer 類的用法 */ public void uriMatcher(){ /* 常量UriMatche.NO_MATCH 標(biāo)示部匹配任何路徑的返回碼 */ UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH); /* 如果match()方法匹配content://cn.itcast.provider.personprovider/person 路徑, * 返回匹配碼為 1 */ /* 添加需要匹配的URL ,如果匹配就會(huì)返回匹配碼 */ sMatcher.addURI("cn.itcast.provider.personprovider", "person", 1); /* # 為通配符 *//* match():方法匹配:content://cn.itcast.provider.personprovider/person/230 * 路徑, 返回匹配碼2 * */ sMatcher.addURI("cn.itcast.provider.personprovider", "person/#", 2); /* 按上述添加的規(guī)則進(jìn)行匹配,不同的路徑匹配返回不同的匹配碼 *//* 下列路徑返回的匹配碼為 2 */ int code = sMatcher.match(Uri.parse("content://cn.itcast.provider.personprovider/person/10")); }
提示:
注冊需要匹配的Uri后,就可以使用sMatcher.match(uri)方法對(duì)輸入的Uri進(jìn)行匹配,如果匹配
就返回匹配碼,匹配碼是調(diào)用addURI()方法傳入的第三個(gè)參數(shù);
3、ContentUris 類的使用介紹:
ContentUris類,用于獲取Uri路徑后面的ID部分,有兩個(gè)比較實(shí)用的方法:
* withAppended(uri,id) 用于為路徑加上ID 部分; Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person"); /* 為路徑添加ID部分 */ Uri resultUri = ContentUris.withAppendedId(uri, 10); /* 添加后的值為:content://cn.itcast.provider.personprovider/person/10 */ * parseID(uri) 從路徑中獲取ID 部分; Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person/10"); /* 下列獲取到的結(jié)果是:10 */ long personid = ContentUris.parseId(uri);
如有疑問請留言或者到本站社區(qū)交流討論,大家共同進(jìn)步,感謝 閱讀,希望能幫助到大家,謝謝大家對(duì)苯中的支持,
- Android使用ContentProvider初始化SDK庫方案小結(jié)
- 基于Android FileProvider 屬性配置詳解及FileProvider多節(jié)點(diǎn)問題
- Android ContentProvider實(shí)現(xiàn)手機(jī)聯(lián)系人讀取和插入
- Android利用ContentProvider獲取本地?cái)?shù)據(jù)的方法
- Android7.0行為變更之適配File Provider的方法
- Android7.0中關(guān)于ContentProvider組件詳解
- Android 中自定義ContentProvider與ContentObserver的使用簡單實(shí)例
- Android控件AppWidgetProvider使用方法詳解
- Android編程之桌面小部件AppWidgetProvider用法示例
- Android實(shí)現(xiàn)花瓣飄落效果的步驟
相關(guān)文章
詳解Android App中的AsyncTask異步任務(wù)執(zhí)行方式
這篇文章主要介紹了Android App中的AsyncTask異步任務(wù)執(zhí)行方式,文中舉了一個(gè)打開網(wǎng)絡(luò)圖片的例子幫助大家直觀理解,需要的朋友可以參考下2016-04-04當(dāng)ListView有Header時(shí) onItemClick里的position不正確的原因
這篇文章主要介紹了當(dāng)ListView有Header時(shí) onItemClick里的position不正確的原因的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07Android9.0 SystemUI 網(wǎng)絡(luò)信號(hào)欄定制修改的流程解析
這篇文章主要介紹了Android9.0 SystemUI 網(wǎng)絡(luò)信號(hào)欄定制修改的流程,本文通過圖文實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11深入剖析Android系統(tǒng)中Service和IntentService的區(qū)別
這篇文章主要介紹了Android系統(tǒng)中Service和IntentService的區(qū)別,與普通的服務(wù)相比,IntentService可以開啟單獨(dú)的線程來處理intent請求,需要的朋友可以參考下2016-04-04