ContentProvider怎么在Android项目中使用

  

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项目中使用