使用ContentProvider共享数据

 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。以前我们学习过文件的操作模式,通过指定文件的操作模式为Context.MODE_WORLD_READABLE 或Context.MODE_WORLD_WRITEABLE同样可以对外共享数据,但数据的访问方式会因数据存储的方式而不同,如:采用xml文件对外共享数据,需要进行xml解析来读写数据;采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据。而使用ContentProvider共享数据的好处是统一了数据访问方式。
当应用需要通过ContentProvider对外共享数据时:
第一步需要继承ContentProvider并重写下面方法:
public class PersonContentProvider extends ContentProvider{
   public boolean onCreate()
   public Uri insert(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)}
第二步需要在AndroidManifest.xml使用<provider>对该ContentProvider进行配置,为了能让其他应用找到该ContentProvider , ContentProvider 采用了authorities(主机名/域名)对它进行唯一标识,你可以把 ContentProvider看作是一个网站(想想,网站也是提供数据者),authorities 就是他的域名:
<manifest .... >
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <provider android:name=".PersonContentProvider" android:authorities="cn.itcast.providers.personprovider"/>
    </application>
</manifest>
 
UriMatcher类使用介绍
因为Uri代表了要操作的数据,所以我们经常需要解析Uri,并从Uri中获取数据。Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher 和ContentUris 。掌握它们的使用,会便于我们的开发工作。
UriMatcher类用于匹配Uri,它的用法如下:
首先第一步把你需要匹配Uri路径全部给注册上,如下:
//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码
UriMatcher  sMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//如果match()方法匹配content://cn.itcast.provider.personprovider/person路径,返回匹配码为1
sMatcher.addURI(“cn.itcast.provider.personprovider”, “person”, 1);//添加需要匹配uri,如果匹配就会返回匹配码,其中第一个参数为主机名
//如果match()方法匹配content://cn.itcast.provider.personprovider/person/230路径,返回匹配码为2
sMatcher.addURI(“cn.itcast.provider.personprovider”, “person/#”, 2);//#号为通配符
switch (sMatcher.match(Uri.parse("content://cn.itcast.provider.personprovider/person/10" ))) {
   case 1
    break;
   case 2
    break;
   default://不匹配
    break;
}
注册完需要匹配的Uri后,就可以使用sMatcher.match(uri)方法对输入的Uri进行匹配,如果匹配就返回匹配码,匹配码是调用addURI()方法传入的第三个参数,假设匹配content://cn.itcast.provider.personprovider/person路径,返回的匹配码为1
 
ContentUris类使用介绍
ContentUris类用于获取Uri路径后面的ID部分,它有两个比较实用的方法:
withAppendedId(uri, id)用于为路径加上ID部分:
Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person")
Uri resultUri = ContentUris.withAppendedId(uri, 10);
//生成后的Uri为:content://cn.itcast.provider.personprovider/person/10
parseId(uri)方法用于从路径中获取ID部分:
Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person/10")
long personid = ContentUris.parseId(uri);//获取的结果为:10
下面是一个范例,必须写在应用的同一个包里或者其子包里:

public class PersonProvider extends ContentProvider {
 private DBOpenHelper dbOpenHelper;
 private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
 private static final int PERSONS = 1;
 private static final int PERSON = 2;
 static{
  MATCHER.addURI("cn.itcast.providers.personprovider", "person", PERSONS);
  MATCHER.addURI("cn.itcast.providers.personprovider", "person/#", PERSON);
 } 
 //删除person表中的所有记录   /person
 //删除person表中指定id的记录 /person/10
 public int delete(Uri uri, String selection, String[] selectionArgs) {
  SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
  int count = 0;
  switch (MATCHER.match(uri)) {
  case PERSONS:
   count = db.delete("person", selection, selectionArgs);
   return count;
   
  case PERSON:
   long id = ContentUris.parseId(uri);
   String where = "personid="+ id;
   if(selection!=null && !"".equals(selection)){
    where = selection + " and " + where;//判断是否有外部条件,如果有则与取得的ID条件想结合,作为一个条件参数传入。
   }
   count = db.delete("person", where, selectionArgs);
   return count;
   
  default:
   throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());
  }
 }

 @Override
 public String getType(Uri uri) {//返回当前操作的数据的mimeType
  switch (MATCHER.match(uri)) {
  case PERSONS:   
  //如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头
   return "vnd.android.cursor.dir/person";
  case PERSON:   

//如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头
   return "vnd.android.cursor.item/person";
   
  default:
   throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());
  }
 }

 @Override
 public Uri insert(Uri uri, ContentValues values) {// /person
  SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
  switch (MATCHER.match(uri)) {
  case PERSONS:
   long rowid = db.insert("person", "name", values);
   Uri insertUri = ContentUris.withAppendedId(uri, rowid);//得到代表新增记录的Uri
   this.getContext().getContentResolver().notifyChange(uri, null);
   return insertUri;

  default:
   throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());
  }
 }

 @Override
 public boolean onCreate() {
  this.dbOpenHelper = new DBOpenHelper(this.getContext());
  return false;
 }
 //查询person表中的所有记录   /person
 //查询person表中指定id的记录 /person/10
 @Override
 public Cursor query(Uri uri, String[] projection, String selection,
   String[] selectionArgs, String sortOrder) {
  SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
  switch (MATCHER.match(uri)) {
  case PERSONS:
   return db.query("person", projection, selection, selectionArgs, null, null, sortOrder);
   
  case PERSON:
   long id = ContentUris.parseId(uri);
   String where = "personid="+ id;
   if(selection!=null && !"".equals(selection)){
    where = selection + " and " + where;
   }
   return db.query("person", projection, where, selectionArgs, null, null, sortOrder);
   
  default:
   throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());
  }
 }
 
 //更新person表中的所有记录   /person
 //更新person表中指定id的记录 /person/10
 @Override
 public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
  SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
  int count = 0;
  switch (MATCHER.match(uri)) {
  case PERSONS:
   count = db.update("person", values, selection, selectionArgs);
   return count;
   
  case PERSON:
   long id = ContentUris.parseId(uri);
   String where = "personid="+ id;
   if(selection!=null && !"".equals(selection)){
    where = selection + " and " + where;
   }
   count = db.update("person", values, where, selectionArgs);
   return count;
   
  default:
   throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());
  }
 }

}

 
 
 

你可能感兴趣的:(使用ContentProvider共享数据)