Android ContentProvider的實(shí)現(xiàn)及簡(jiǎn)單實(shí)例代碼
一、概念及說(shuō)明
ContentProvider定義:
內(nèi)容提供者是一個(gè)Android應(yīng)用的基礎(chǔ)模塊,提供內(nèi)容給這個(gè)應(yīng)用,它們封裝數(shù)據(jù)和提供它給應(yīng)用通過(guò)這個(gè)ContentResolver接口,使用ContentProvider可以在不同的應(yīng)用程序之間共享數(shù)據(jù),android為常見(jiàn)的一些數(shù)據(jù)提供了ContentProvider(視頻、音頻),ContentProvider使用表的形式來(lái)組織數(shù)據(jù)。
URI定義:
每一個(gè)ContentProvider都擁有一個(gè)公共的URI,這個(gè)URI用于表示這個(gè)ContentProvider所提供的數(shù)據(jù)。android所提供ContentProvider都存放在android.provider。
二、實(shí)現(xiàn)ContentProvider的過(guò)程
1。定義ContentProvider所需要的常量(最主要的是定義CONTENT_URI,CONTENT_URI是Uri類(lèi)型,事實(shí)是通過(guò)字符串解析得到)
//定義ContentProvider所需要的常量 public class FirstProviderMetaData { // AUTHORIY等于自己的創(chuàng)建ContentProvider類(lèi)的完全路徑 public static final String AUTHORIY = "com.example.firstconent.FirstContentProvider"; // 數(shù)據(jù)庫(kù)的名稱(chēng) public static final String DATABASE_NAME = "FirstProvider.db"; // BaseColumns有兩個(gè)字段_id和_count public static final class UserTableMetaData implements BaseColumns { // 表名 public static final String TABLE_NAME = "t_user"; // 訪(fǎng)問(wèn)該ContentProvider的URI public static final Uri CONTENT_URI = Uri .parse("content://" + AUTHORIY); // 表的數(shù)據(jù)類(lèi)型 public static final String CONTENT_TYPE = "vnd.android.cursor.dir/users"; // 一列的數(shù)據(jù)類(lèi)型 public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/users"; // 一個(gè)字段 public static final String USER_NAME = "name"; // 默認(rèn)排序 public static final String DEFAULT_SORT_ORDER = "_id desc"; } }
2。定義一個(gè)類(lèi),繼承ContentProvider
3。實(shí)現(xiàn)query,insert,update,delete,getType和onCreate方法
(1).定義UriMatcher
// 匹配Uri,檢查Uri的合法性 public static final UriMatcher uriMatcher; public static final int INCOMING_USER_COLLECTION = 1; public static final int INCOMING_USER_SIGNLE = 2; static { // 創(chuàng)建一個(gè)uri樹(shù)的根結(jié)點(diǎn) uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); // 添加uri匹配對(duì),如果這個(gè)匹配成功,則code值則會(huì)返回。 uriMatcher.addURI(FirstProviderMetaData.AUTHORIY, "/t_user", INCOMING_USER_COLLECTION); uriMatcher.addURI(FirstProviderMetaData.AUTHORIY, "/t_user/#", INCOMING_USER_SIGNLE); }
(2).重寫(xiě)getType方法
// 根據(jù)傳入uri,所回該uri所表示的數(shù)據(jù)類(lèi)型 @Override public String getType(Uri uri) { // TODO Auto-generated method stub switch (uriMatcher.match(uri)) { case INCOMING_USER_COLLECTION: return UserTableMetaData.CONTENT_TYPE; case INCOMING_USER_SIGNLE: return UserTableMetaData.CONTENT_ITEM_TYPE; default: throw new IllegalArgumentException("Unknown URI" + uri); } }
(3).創(chuàng)建userProjectMap哈希Map靜態(tài)對(duì)象
public static HashMap<String, String> userProjectMap; static { userProjectMap = new HashMap<String, String>(); userProjectMap.put(UserTableMetaData._ID, UserTableMetaData._ID); userProjectMap.put(UserTableMetaData.USER_NAME, UserTableMetaData.USER_NAME); }
(4).重寫(xiě)insert方法
// 該方法返回值是一個(gè)uri,這個(gè)uri表示的剛剛使用這個(gè)方法所插入的數(shù)據(jù) @Override public Uri insert(Uri uri, ContentValues values) { // TODO Auto-generated method stub SQLiteDatabase db = dbHelper.getWritableDatabase(); // rowId是新插入數(shù)據(jù)的id long rowId = db.insert(UserTableMetaData.TABLE_NAME, null, values); // 正常插入,-1為出常錯(cuò)誤 if (rowId != -1) { // 添加一個(gè)id到這個(gè)路徑的結(jié)尾 Uri insertUserUri = ContentUris.withAppendedId( UserTableMetaData.CONTENT_URI, rowId); // 得到一個(gè)ContentResolver實(shí)例. ContentResolver cr = this.getContext().getContentResolver(); // 通辭呈數(shù)據(jù)改變 cr.notifyChange(insertUserUri, null); return insertUserUri; } else { throw new SQLException("Failed to insert row into" + uri); } }
(5).重寫(xiě)query方法
@Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // TODO Auto-generated method stub SQLiteQueryBuilder sqb = new SQLiteQueryBuilder(); switch (uriMatcher.match(uri)) { case INCOMING_USER_COLLECTION: sqb.setTables(UserTableMetaData.TABLE_NAME); sqb.setProjectionMap(userProjectMap); break; case INCOMING_USER_SIGNLE: sqb.setTables(UserTableMetaData.TABLE_NAME); sqb.setProjectionMap(userProjectMap); String idKey = UserTableMetaData._ID; // 1得到path集合 // 2取它的集合的第2個(gè)元素 // 例如:CONTENT_URI等于content://com.example.firstconent.FirstContentProvider/t_user/id, // content://為協(xié)議 // com.example.firstconent.FirstContentProvider為authoriy // /t_user/id為path String idValue = uri.getPathSegments().get(1); sqb.appendWhere(idKey + "=" + idValue); break; } String orderBy = null; if (TextUtils.isEmpty(sortOrder)) { orderBy = UserTableMetaData.DEFAULT_SORT_ORDER; } else { orderBy = sortOrder; } SQLiteDatabase db = dbHelper.getWritableDatabase(); Cursor cursor = sqb.query(db, projection, selection, selectionArgs, null, null, orderBy); ContentResolver cr = this.getContext().getContentResolver(); // 通適數(shù)據(jù)變動(dòng) cursor.setNotificationUri(cr, uri); return cursor; }
4。在AndroidManifest.xml中聲明
<provider android:name="com.example.firstcontent.FirstContentProvider" android:authorities="com.example.first.firstcontent.FirstContentProvider" > </provider>
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- 實(shí)例講解Android中ContentProvider組件的使用方法
- Android應(yīng)用中使用ContentProvider掃描本地圖片并顯示
- Android中自定義ContentProvider實(shí)例
- Android開(kāi)發(fā)之ContentProvider的使用詳解
- Android 自定義ContentProvider簡(jiǎn)單實(shí)例
- Android數(shù)據(jù)持久化之ContentProvider機(jī)制詳解
- Android開(kāi)發(fā)教程之ContentProvider數(shù)據(jù)存儲(chǔ)
- android基礎(chǔ)總結(jié)篇之八:創(chuàng)建及調(diào)用自己的ContentProvider
- Android學(xué)習(xí)筆記之ContentProvider和Uri詳解
- 詳解Android ContentProvider的基本原理和使用
相關(guān)文章
Android實(shí)現(xiàn)掃一掃功能之繪制指定區(qū)域透明區(qū)域
這篇文章主要給大家介紹了關(guān)于Android實(shí)現(xiàn)掃一掃功能之繪制指定區(qū)域透明區(qū)域的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2018-07-07RecylerView實(shí)現(xiàn)流布局StaggeredGridLayoutManager使用詳解
這篇文章主要為大家詳細(xì)介紹了RecylerView實(shí)現(xiàn)流布局StaggeredGridLayoutManager使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09Android?RecyclerView曝光采集的實(shí)現(xiàn)方法
這篇文章主要為大家詳細(xì)介紹了Android?RecyclerView曝光采集的實(shí)現(xiàn)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01Android實(shí)現(xiàn) EditText輸入手機(jī)號(hào)空格功能
這篇文章主要介紹了Android實(shí)現(xiàn) EditText輸入手機(jī)號(hào)空格功能,實(shí)現(xiàn)思路是要重寫(xiě)TextWatcher,每次EditText內(nèi)容變化,都判斷內(nèi)容是否符合要求,具體實(shí)例代碼大家參考下本文2018-02-02Android 實(shí)現(xiàn)閃屏頁(yè)和右上角的倒計(jì)時(shí)跳轉(zhuǎn)實(shí)例代碼
本文給大家分享一段實(shí)例代碼給大家介紹android實(shí)現(xiàn)閃屏頁(yè)和右上角的倒計(jì)時(shí)跳轉(zhuǎn)實(shí)例代碼,閃屏頁(yè)用到了handler和CountDownTimer類(lèi),還需配置一下Activity的主題,感興趣的朋友參考下吧2016-02-02Android實(shí)現(xiàn)自由拖動(dòng)并顯示文字的懸浮框
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)自由拖動(dòng)并顯示文字的懸浮框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01Android RecycleView使用(CheckBox全選、反選、單選)
這篇文章主要為大家詳細(xì)介紹了Android RecycleView使用,CheckBox全選、反選、單選效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09Android使用友盟集成QQ、微信、微博等第三方分享與登錄方法詳解
之前的項(xiàng)目第三方分享和登錄一直都使用ShareSDK實(shí)現(xiàn)的。為了統(tǒng)一使用友盟的全家桶,所以三方分享和登錄也就選擇了友盟,這里為大家整理出詳細(xì)方法2018-03-03