ContentProvider怎么在Android项目中使用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
<强>一、概念及说明
强>
<强> ContentProvider定义:
强>
内容提供者是一个Android应用的基础模块,提供内容给这个应用,它们封装数据和提供它给应用通过这个ContentResolver接口,使用ContentProvider可以在不同的应用程序之间共享数据,Android为常见的一些数据提供了内容提供者(视频,音频),ContentProvider使用表的形式来组织数据。
, URI定义:
每一个内容提供者都拥有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据.android所提供ContentProvider都存放在android.provider。
<强>二,实现ContentProvider的过程
强>
1。定义ContentProvider所需要的常量(最主要的是定义CONTENT_URI, CONTENT_URI是URI类型,事实是通过字符串解析得到)
//定义ContentProvider所需要的常量 公开课FirstProviderMetaData {//AUTHORIY等于自己的创建ContentProvider类的完全路径 公共静态最终字符串AUTHORIY=癱om.example.firstconent.FirstContentProvider";//数据库的名称 公共静态最终字符串DATABASE_NAME=癋irstProvider.db";//BaseColumns有两个字段_id和_count 公共静态最终类UserTableMetaData实现BaseColumns {//表名 公共静态最终字符串TABLE_NAME=皌_user";//访问该ContentProvider的URI 公共静态最终Uri CONTENT_URI=Uri .parse(“内容://?+ AUTHORIY);//表的数据类型 公共静态最终字符串CONTENT_TYPE=皏nd.android.cursor.dir/users";//一列的数据类型 公共静态最终字符串CONTENT_ITEM_TYPE=皏nd.android.cursor.item/users";//一个字段 公共静态最终字符串USER_NAME=皀ame";//默认排序 公共静态最终字符串DEFAULT_SORT_ORDER=癬id desc"; } }
2。定义一个类,继承ContentProvider
3。实现查询,插入,更新,删除,方法和onCreate方法
(1)。定义UriMatcher
//匹配Uri,检查Uri的合法性 公共静态最终UriMatcher UriMatcher; 公共静态最终int INCOMING_USER_COLLECTION=1; 公共静态最终int INCOMING_USER_SIGNLE=2; 静态{//创建一个uri树的根结点 uriMatcher=new uriMatcher (UriMatcher.NO_MATCH);//添加uri匹配对,如果这个匹配成功,则代码值则会返回。 uriMatcher.addURI (FirstProviderMetaData。AUTHORIY、“/t_user" INCOMING_USER_COLLECTION); uriMatcher.addURI (FirstProviderMetaData。“AUTHORIY;/t_user/#“; INCOMING_USER_SIGNLE); }
(2)。重写方法方法
//根据传入uri,所回该uri所表示的数据类型 @Override 公共字符串方法(Uri Uri) {//TODO自动生成方法存根 开关(uriMatcher.match (uri)) { 案例INCOMING_USER_COLLECTION: 返回UserTableMetaData.CONTENT_TYPE; 案例INCOMING_USER_SIGNLE: 返回UserTableMetaData.CONTENT_ITEM_TYPE; 默认值: 把新的IllegalArgumentException(“未知URI"+ uri); } }
(3)。创建userProjectMap哈希映射静态对象
公共静态HashMap<字符串,String>userProjectMap; 静态{ userProjectMap=new HashMap<字符串,String> (); userProjectMap.put (UserTableMetaData。_ID UserTableMetaData._ID); userProjectMap.put (UserTableMetaData.USER_NAME UserTableMetaData.USER_NAME); }
(4)。重写插入方法
//该方法返回值是一个uri,这个uri表示的刚刚使用这个方法所插入的数据 @Override 公共Uri插入(Uri Uri, ContentValues值){//TODO自动生成方法存根 SQLiteDatabase db=dbHelper.getWritableDatabase ();//rowId是新插入数据的id 长rowId=db.insert (UserTableMetaData。TABLE_NAME、零值);//正常插入1为出常错误 如果(rowId !=1) {//添加一个id到这个路径的结尾 Uri insertUserUri=ContentUris.withAppendedId ( UserTableMetaData。CONTENT_URI, rowId);//得到一个ContentResolver实例。 .getContentResolver ContentResolver cr=this.getContext () ();//通辞呈数据改变 cr.notifyChange (insertUserUri, null); 返回insertUserUri; 其他}{ 把新SQLException异常(“未能插入行into"+ uri); } }
(5)。重写查询方法
@Override 公共游标查询(Uri Uri, String[]投影,字符串的选择, String [] selectionArgs字符串排序方式){//TODO自动生成方法存根 SQLiteQueryBuilder sqb=new SQLiteQueryBuilder (); 开关(uriMatcher.match (uri)) { 案例INCOMING_USER_COLLECTION: sqb.setTables (UserTableMetaData.TABLE_NAME); sqb.setProjectionMap (userProjectMap); 打破; 案例INCOMING_USER_SIGNLE: sqb.setTables (UserTableMetaData.TABLE_NAME); sqb.setProjectionMap (userProjectMap); 字符串idKey=UserTableMetaData._ID;//1得到路径集合//2取它的集合的第2个元素//例如:CONTENT_URI等于内容://com.example.firstconent.FirstContentProvider t_user/id,//内容://为协议//com.example.firstconent.FirstContentProvider为authoriy///t_user/id为路径 字符串idValue=https://www.yisu.com/zixun/uri.getPathSegments () . get (1); sqb。appendWhere (idKey + "=" + idValue); 打破; } 字符串orderBy=零; 如果(TextUtils.isEmpty(排序方式)){ orderBy=UserTableMetaData.DEFAULT_SORT_ORDER; 其他}{ orderBy=排序方式; } SQLiteDatabase db=dbHelper.getWritableDatabase (); 鼠标光标=sqb。查询(db、投影、选择、selectionArgs 空,空,orderBy); .getContentResolver ContentResolver cr=this.getContext () ();//通适数据变动 游标。setNotificationUri (cr、uri); 返回指针; }ContentProvider怎么在Android项目中使用