国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android ContentProvider的實(shí)現(xiàn)及簡(jiǎn)單實(shí)例代碼

2019-10-23 19:49:32
字體:
供稿:網(wǎng)友

一、概念及說明

ContentProvider定義:

內(nèi)容提供者是一個(gè)Android應(yīng)用的基礎(chǔ)模塊,提供內(nèi)容給這個(gè)應(yīng)用,它們封裝數(shù)據(jù)和提供它給應(yīng)用通過這個(gè)ContentResolver接口,使用ContentProvider可以在不同的應(yīng)用程序之間共享數(shù)據(jù),android為常見的一些數(shù)據(jù)提供了ContentProvider(視頻、音頻),ContentProvider使用表的形式來組織數(shù)據(jù)。

 URI定義:

每一個(gè)ContentProvider都擁有一個(gè)公共的URI,這個(gè)URI用于表示這個(gè)ContentProvider所提供的數(shù)據(jù)。android所提供ContentProvider都存放在android.provider。

二、實(shí)現(xiàn)ContentProvider的過程

1。定義ContentProvider所需要的常量(最主要的是定義CONTENT_URI,CONTENT_URI是Uri類型,事實(shí)是通過字符串解析得到)

//定義ContentProvider所需要的常量 public class FirstProviderMetaData {    // AUTHORIY等于自己的創(chuàng)建ContentProvider類的完全路徑   public static final String AUTHORIY = "com.example.firstconent.FirstContentProvider";    // 數(shù)據(jù)庫(kù)的名稱   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";     // 訪問該ContentProvider的URI     public static final Uri CONTENT_URI = Uri         .parse("content://" + AUTHORIY);      // 表的數(shù)據(jù)類型     public static final String CONTENT_TYPE = "vnd.android.cursor.dir/users";     // 一列的數(shù)據(jù)類型     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è)類,繼承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樹的根結(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).重寫getType方法

// 根據(jù)傳入uri,所回該uri所表示的數(shù)據(jù)類型   @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).重寫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).重寫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ì)本站的支持!


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到Android開發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 吕梁市| 松滋市| 南岸区| 南澳县| 永川市| 邯郸市| 南澳县| 交口县| 贵溪市| 延安市| 万宁市| 宜良县| 阆中市| 永济市| 长丰县| 辽阳县| 汶上县| 安义县| 卢湾区| 赣榆县| 岱山县| 滦南县| 霍城县| 镇巴县| 新泰市| 五台县| 柳江县| 桑日县| 马龙县| 衡南县| 永康市| 光山县| 南涧| 博乐市| 彭阳县| 霍邱县| 陇南市| 遂川县| 辉县市| 手游| 永福县|