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

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

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

2019-12-12 03:50:34
字體:
供稿:網(wǎng)友

一、概念及說明

ContentProvider定義:

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

 URI定義:

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

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

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

//定義ContentProvider所需要的常量 public class FirstProviderMetaData {    // AUTHORIY等于自己的創(chuàng)建ContentProvider類的完全路徑   public static final String AUTHORIY = "com.example.firstconent.FirstContentProvider";    // 數(shù)據(jù)庫的名稱   public static final String DATABASE_NAME = "FirstProvider.db";    // BaseColumns有兩個字段_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";      // 一個字段     public static final String USER_NAME = "name";      // 默認(rèn)排序     public static final String DEFAULT_SORT_ORDER = "_id desc";   } } 

2。定義一個類,繼承ContentProvider

3。實現(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)建一個uri樹的根結(jié)點     uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);     // 添加uri匹配對,如果這個匹配成功,則code值則會返回。     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)對象

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方法

// 該方法返回值是一個uri,這個uri表示的剛剛使用這個方法所插入的數(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為出常錯誤     if (rowId != -1) {       // 添加一個id到這個路徑的結(jié)尾       Uri insertUserUri = ContentUris.withAppendedId(           UserTableMetaData.CONTENT_URI, rowId);       // 得到一個ContentResolver實例.       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個元素       // 例如: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ù)變動     cursor.setNotificationUri(cr, uri);     return cursor;   } 

4。在AndroidManifest.xml中聲明

<provider       android:name="com.example.firstcontent.FirstContentProvider"       android:authorities="com.example.first.firstcontent.FirstContentProvider" >     </provider>

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 维西| 隆尧县| 馆陶县| 临江市| 台北县| 庆安县| 清丰县| 高密市| 平潭县| 青州市| 安泽县| 海林市| 定南县| 淄博市| 金门县| 镇江市| 英超| 华池县| 洛隆县| 南川市| 民权县| 阿尔山市| 万全县| 新宾| 菏泽市| 武汉市| 青岛市| 中山市| 福安市| 巴青县| 喀喇沁旗| 库车县| 左权县| 长沙市| 基隆市| 永定县| 张家港市| 卫辉市| 调兵山市| 兰坪| 双峰县|