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>
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!