Android ContentProvider的实现及简单实例代码
一、概念及说明
ContentProvider定义:
内容提供者是一个Android应用的基础模块,提供内容给这个应用,它们封装数据和提供它给应用通过这个ContentResolver接口,使用ContentProvider可以在不同的应用程序之间共享数据,android为常见的一些数据提供了ContentProvider(视频、音频),ContentProvider使用表的形式来组织数据。
URI定义:
每一个ContentProvider都拥有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据。android所提供ContentProvider都存放在android.provider。
二、实现ContentProvider的过程
1。定义ContentProvider所需要的常量(最主要的是定义CONTENT_URI,CONTENT_URI是Uri类型,事实是通过字符串解析得到)
//定义ContentProvider所需要的常量 publicclassFirstProviderMetaData{ //AUTHORIY等于自己的创建ContentProvider类的完全路径 publicstaticfinalStringAUTHORIY="com.example.firstconent.FirstContentProvider"; //数据库的名称 publicstaticfinalStringDATABASE_NAME="FirstProvider.db"; //BaseColumns有两个字段_id和_count publicstaticfinalclassUserTableMetaDataimplementsBaseColumns{ //表名 publicstaticfinalStringTABLE_NAME="t_user"; //访问该ContentProvider的URI publicstaticfinalUriCONTENT_URI=Uri .parse("content://"+AUTHORIY); //表的数据类型 publicstaticfinalStringCONTENT_TYPE="vnd.android.cursor.dir/users"; //一列的数据类型 publicstaticfinalStringCONTENT_ITEM_TYPE="vnd.android.cursor.item/users"; //一个字段 publicstaticfinalStringUSER_NAME="name"; //默认排序 publicstaticfinalStringDEFAULT_SORT_ORDER="_iddesc"; } }
2。定义一个类,继承ContentProvider
3。实现query,insert,update,delete,getType和onCreate方法
(1).定义UriMatcher
//匹配Uri,检查Uri的合法性 publicstaticfinalUriMatcheruriMatcher; publicstaticfinalintINCOMING_USER_COLLECTION=1; publicstaticfinalintINCOMING_USER_SIGNLE=2; static{ //创建一个uri树的根结点 uriMatcher=newUriMatcher(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方法
//根据传入uri,所回该uri所表示的数据类型 @Override publicStringgetType(Uriuri){ //TODOAuto-generatedmethodstub switch(uriMatcher.match(uri)){ caseINCOMING_USER_COLLECTION: returnUserTableMetaData.CONTENT_TYPE; caseINCOMING_USER_SIGNLE: returnUserTableMetaData.CONTENT_ITEM_TYPE; default: thrownewIllegalArgumentException("UnknownURI"+uri); } }
(3).创建userProjectMap哈希Map静态对象
publicstaticHashMap<String,String>userProjectMap; static{ userProjectMap=newHashMap<String,String>(); userProjectMap.put(UserTableMetaData._ID,UserTableMetaData._ID); userProjectMap.put(UserTableMetaData.USER_NAME, UserTableMetaData.USER_NAME); }
(4).重写insert方法
//该方法返回值是一个uri,这个uri表示的刚刚使用这个方法所插入的数据 @Override publicUriinsert(Uriuri,ContentValuesvalues){ //TODOAuto-generatedmethodstub SQLiteDatabasedb=dbHelper.getWritableDatabase(); //rowId是新插入数据的id longrowId=db.insert(UserTableMetaData.TABLE_NAME,null,values); //正常插入,-1为出常错误 if(rowId!=-1){ //添加一个id到这个路径的结尾 UriinsertUserUri=ContentUris.withAppendedId( UserTableMetaData.CONTENT_URI,rowId); //得到一个ContentResolver实例. ContentResolvercr=this.getContext().getContentResolver(); //通辞呈数据改变 cr.notifyChange(insertUserUri,null); returninsertUserUri; }else{ thrownewSQLException("Failedtoinsertrowinto"+uri); } }
(5).重写query方法
@Override publicCursorquery(Uriuri,String[]projection,Stringselection, String[]selectionArgs,StringsortOrder){ //TODOAuto-generatedmethodstub SQLiteQueryBuildersqb=newSQLiteQueryBuilder(); switch(uriMatcher.match(uri)){ caseINCOMING_USER_COLLECTION: sqb.setTables(UserTableMetaData.TABLE_NAME); sqb.setProjectionMap(userProjectMap); break; caseINCOMING_USER_SIGNLE: sqb.setTables(UserTableMetaData.TABLE_NAME); sqb.setProjectionMap(userProjectMap); StringidKey=UserTableMetaData._ID; //1得到path集合 //2取它的集合的第2个元素 //例如:CONTENT_URI等于content://com.example.firstconent.FirstContentProvider/t_user/id, //content://为协议 //com.example.firstconent.FirstContentProvider为authoriy ///t_user/id为path StringidValue=uri.getPathSegments().get(1); sqb.appendWhere(idKey+"="+idValue); break; } StringorderBy=null; if(TextUtils.isEmpty(sortOrder)){ orderBy=UserTableMetaData.DEFAULT_SORT_ORDER; }else{ orderBy=sortOrder; } SQLiteDatabasedb=dbHelper.getWritableDatabase(); Cursorcursor=sqb.query(db,projection,selection,selectionArgs, null,null,orderBy); ContentResolvercr=this.getContext().getContentResolver(); //通适数据变动 cursor.setNotificationUri(cr,uri); returncursor; }
4。在AndroidManifest.xml中声明
<provider android:name="com.example.firstcontent.FirstContentProvider" android:authorities="com.example.first.firstcontent.FirstContentProvider"> </provider>
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!