android数据存储:ContentProvider数据共享

来源:互联网 发布:淘宝小二怎么联系 编辑:程序博客网 时间:2024/04/28 14:54

ContentProvider的主要作用是将应用中的数据对外进行共享。应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据,统一了数据访问方式。

             以前学习过文件的操作模式,通过指定文件的操作模式为Context.MODE_WORLD_READABLEContext.MODE_WORLD_WRITEABLE同样可以对外共享数据,但数据的访问方式会因数据存储的方式而不同,

1:继承ContentProvider,并重写下列方法

   public booleanonCreate()

   public Uriinsert(Uri uri, ContentValues values)

   public int delete(Uri uri, String selection, String[] selectionArgs)

   public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)

   public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)

   public String getType(Uri uri)

 

2:配置androidManifest.xml

使用<provider>对该ContentProvider进行配置,为了能让其他应用找到该ContentProvider, ContentProvider 采用authorities(主机名/域名)对它进行唯一标识

<manifest .... >   <application android:icon="@drawable/icon" android:label="@string/app_name">     <provider android:name=".DiaryContentProvider" android:authorities=cn.bzu.providers.diaryprovider"/>    </application></manifest>


 

Android系统提供了两个用于操作Uri的工具类,分别为UriMatcherContentUris ,

              UriMatcher类用于匹配Uri,  需要匹配的Uri路径全部注册上,如下:

                      //常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码

                     UriMatcher  sMatcher = new UriMatcher(UriMatcher.NO_MATCH);

                       匹配码是调用addURI()方法传入的第三个参数

                     //如果match()方法匹配content://cn.bzu.providers.diarycontentprovider/diary路径,返回匹配码为1

                      sMatcher.addURI(“cn.bzu.providers.diarycontentprovider”, “diary”, 1);//匹配就会返回匹配码1

                    //如果match()方法匹配content:// cn.bzu.providers.diarycontentprovider /diary/10路径,返回匹配码为2

                     sMatcher.addURI(“cn.bzu.providers.diarycontentprovider”, “diary/#”, 2);//#号为通配符

                     注册完Uri后,使用sMatcher.match(uri)方法对输入的Uri进行匹配。

            ContentUris类用于获取Uri路径后面的ID部分,它有两个方法:

                     withAppendedId(uri, id)用于为路径加上ID部分:

                     Uri uri = Uri.parse("content://cn.bzu.providers.diarycontentprovider/diary/")

                     Uri resultUri = ContentUris.withAppendedId(uri, 10);

                      //生成后的Uri为:content://cn.bzu.providers.diarycontentprovider/diary /10

                      parseId(uri)方法用于从路径中获取ID部分:

                     Uri uri = Uri.parse("content://cn.bzu.providers.diarycontentprovider/diary /10")

                      long personid = ContentUris.parseId(uri);//获取的结果为:10

3:编写SQLiteDatabase类

public class SQLiteDatabase extends SQLiteOpenHelper {private static final String DBNAME = "diary.db";private static final int DBVERSION = 1;public DBHelper(Context context) {super(context, DBNAME, null, DBVERSION);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL("create table tb_diary(_id integer primary key autoincrement,title varchar(20),content varchar(1000),pubdate)");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}}


 

DiaryContentProvider类

public class DiaryContentProvider extends ContentProvider {   private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);            private DBHelper dbHelper;            private static final int DIARIES = 1;         private static final int DIARIE = 2;      //创建provider首先调用静态构造方法          static {                      URI_MATCHER.addURI("cn.bzu.providers.diarycontentprovider", "diary", DIARIES);        URI_MATCHER.addURI("cn.bzu.providers.diarycontentprovider","diary/#",DIARIE);            }      @Override      public boolean onCreate() {            dbHelper=new DBHelper(getContext());                      return true;      }            //删除一条记录@Overridepublic int delete(Uri uri, String selection, String[] selectionargs) {SQLiteDatabase db=dbHelper.getWritableDatabase();                     int count=0;                 switch (URI_MATCHER.match(uri)) {                                             case DIARIES:                                                             count=db.delete("tb_diary", values,selection,selectionArgs);//更新的记录数                 return count;                                             case DIARY:                                                             long id=ContentUris.parseId(uri);                            String where=”_id=”+id;                                                             if(selection!=null&&!””.equals(selection))  {                     where=selection+”and”+where; }                      count=db.delete(“tb_diary”,values,where,selectionArgs);                                                             return count;                                                default: throw new IllegalArgumentException("UnKnown uri:"+uri.toString());     }}       //返回当前Uri所代表数据的MIME类型          操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头                       得到所有diary记录的Uri为content://cn.bzu.providers.diaryprovider/diary,那么返回的MIME类型字符串为:"vnd.android.cursor.dir/diary”          非集合类型的数据,MIME类型字符串为:vnd.android.cursor.item/开头  //uri:content://cn.bzu.providers.diaryprovider/diary/2,MIME:vnd.android.cursor.item/diary       @Overridepublic String getType(Uri uri) {   switch (URI_MATCHER.match(uri)) {                             case DIARIES:                      return "vnd.android.cursor.dir/diary";break;                                   case DIARY:                                          return "vnd.android.cursor.item/diary";break;                             default:throw new IllegalArgumentException("UnKnown uri:"+uri.toString());       }}@Overridepublic Uri insert(Uri uri, ContentValues values) { // diary 代表往diary表中添加数据                                   SQLiteDatabase db=dbHelper.getWritableDatabase();                                   switch (URI_MATCHER.match(uri)) {                                           case DIARIES:                                                          //存放新添加行的id                                             long rowid=db.insert("tb_diary", "title",values);                    //实现在传过来的uri的基础上附加上rowid的值                                 Uri insertUri=ContentUris.withAppendedId(uri, rowid);                              return insertUri;                                          default:throw new IllegalArgumentException("UnKnown uri:"+uri.toString());             }}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {      SQLiteDatabase db=dbHelper.getReadableDatabase();                           switch (URI_MATCHER.match(uri)) {                             case DIARIES:   return db.query("tb_diary",projection,selection,selectionArgs,null,null, sortOrder);                    break;               case DIARY:                   long id=ContentUris.parseId(uri);                  String where=”_id=”+id;                  if(selection!=null&&!””.equals(selection)){                           where=selection+” and”+where;                    }             count=db.query(“tb_diary”,projection,where,selectionArgs,null,null, sortOrder);                  return count;break;              default:throw new IllegalArgumentException("UnKnown uri:"+uri.toString());              }}@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {SQLiteDatabase db=dbHelper.getWritableDatabase();             int count=0;             switch (URI_MATCHER.match(uri)) {                 case DIARIES:                        //更新的记录数                      count=db.update("tb_diary", values,selection,selectionArgs);                        return count;break;                 case DIARY:                      long id=ContentUris.parseId(uri);                      String where=”_id=”+id;                      if(selection!=null&&!””.equals(selection)){                            where=selection+” and”+where;                        }                       count=db.update(“tb_diary”,values,where,selectionArgs);                      return count;break;                 default:throw new IllegalArgumentException("UnKnown uri:"+uri.toString());              }}}

 

单元测试:

   测试添加

public  void testInsert() throws Throwable{    ContentResolver contentResolver=this.getContext().getContentResolver();    //定义Uri路径    Uri uri=Uri.parse(“content://cn.bzu.providers.diaryprovider/diary”);   ContentValues values=new ContentValues();     values.put(“title”,”很高兴”);     values.put(“content”,”呵呵”);     values.put(“pubdate”,”2012-11-25”);   Uri uri=contentResover.insert(uri,values);}




 

 

 

	
				
		
原创粉丝点击