ContentProvider与ContentResolver使用【转】

这篇文章被转载而转载者未注明原文出处,在此未加上原文地址链接,本人向原作者致以歉意。

下面是文章内容:

使用ContentProvider共享数据:

当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据;采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据。而使用ContentProvider共享数据的好处是统一了数据访问方式。

当应用需要通过ContentProvider对外共享数据时,第一步需要继承ContentProvider并重写下面方法:

 
  1. public class PersonContentProvider extends ContentProvider   
  2. {   
  3.   
  4. public boolean onCreate()   
  5.   
  6. public Uri insert(Uri uri, ContentValues values)   
  7.   
  8. public int delete(Uri uri, String selection, String[] selectionArgs)   
  9.   
  10. public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)   
  11.   
  12. public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)   
  13.   
  14. public String getType(Uri uri)   
  15. }  

第二步需要在AndroidManifest.xml使用<provider>对该ContentProvider进行配置,为了能让其他应用找到该ContentProvider , ContentProvider 采用了authorities(主机名/域名)对它进行唯一标识,你可以把ContentProvider看作是一个网站(想想,网站也是提供数据者),authorities 就是他的域名:

 
  1. <manifest .... >   
  2.   
  3. <application android:icon="@drawable/icon" android:label="@string/app_name">   
  4.   
  5. <provider android:name=".PersonContentProvider" android:authorities="cn.itcast.provider.personprovider"/>   
  6.   
  7. </application>   
  8.   
  9. </manifest>  

注意:一旦应用继承了ContentProvider类,后面我们就会把这个应用称为ContentProvider(内容提供者)。

Uri介绍:

Uri代表了要操作的数据,Uri主要包含了两部分信息:1》需要操作的ContentProvider ,2》对ContentProvider中的什么数据进行操作,一个Uri由以下几部分组成:

l

ContentProvider(内容提供者)的scheme已经由Android所规定, scheme为:content://

主机名(或叫Authority)用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。

路径(path)可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:

要操作person表中id为10的记录,可以构建这样的路径:/person/10

要操作person表中id为10的记录的name字段, person/10/name

要操作person表中的所有记录,可以构建这样的路径:/person

要操作xxx表中的记录,可以构建这样的路径:/xxx

当然要操作的数据不一定来自数据库,也可以是文件等他存储方式,如下:

要操作xml文件中person节点下的name节点,可以构建这样的路径:/person/name

如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:

Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person")

UriMatcher类使用介绍:

因为Uri代表了要操作的数据,所以我们很经常需要解析Uri,并从Uri中获取数据。Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher 和ContentUris 。掌握它们的使用,会便于我们的开发工作。

UriMatcher类用于匹配Uri,它的用法如下:

首先第一步把你需要匹配Uri路径全部给注册上,如下:

 
  1. //常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码   
  2.   
  3. UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH);   
  4.   
  5. //如果match()方法匹配content://cn.itcast.provider.personprovider/person路径,返回匹配码为1   
  6.   
  7. sMatcher.addURI(“cn.itcast.provider.personprovider”, “person”, 1);//添加需要匹配uri,如果匹配就会返回匹配码   
  8.   
  9. //如果match()方法匹配content://cn.itcast.provider.personprovider/person/230路径,返回匹配码为2   
  10.   
  11. sMatcher.addURI(“cn.itcast.provider.personprovider”, “person/#”, 2);//#号为通配符   
  12.   
  13. switch (sMatcher.match(Uri.parse("content://cn.itcast.provider.personprovider/person/10")))    
  14. {   
  15.   
  16.     case 1:   
  17.   
  18.         break;   
  19.   
  20.     case 2:   
  21.   
  22.         break;   
  23.   
  24.     default://不匹配   
  25.   
  26.         break;   
  27.   
  28. }  

注册完需要匹配的Uri后,就可以使用sMatcher.match(uri)方法对输入的Uri进行匹配,如果匹配就返回匹配码,匹配码是调用addURI()方法传入的第三个参数,假设匹配content://cn.itcast.provider.personprovider/person路径,返回的匹配码为1

ContentUris类使用介绍:

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

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

 
  1. Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person")   
  2.   
  3. Uri resultUri = ContentUris.withAppendedId(uri, 10);   
  4.   
  5. //生成后的Uri为:content://cn.itcast.provider.personprovider/person/10  

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

 
  1. Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person/10")   
  2.   
  3. long personid = ContentUris.parseId(uri);//获取的结果为:10  

使用ContentProvider共享数据:

ContentProvider类主要方法的作用:

public boolean onCreate()

该方法在ContentProvider创建后就会被调用, Android在系统启动时就会创建ContentProvider 。

public Uri insert(Uri uri, ContentValues values)

该方法用于供外部应用往ContentProvider添加数据。

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

该方法用于供外部应用从ContentProvider删除数据。

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

该方法用于供外部应用更新ContentProvider中的数据。

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

该方法用于供外部应用从ContentProvider中获取数据。

public String getType(Uri uri)

该方法用于返回当前Url所代表数据的MIME类型。

如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头,例如:要得到所有person记录的Uri为content://cn.itcast.provider.personprovider/person,那么返回的MIME类型字符串应该为:“vnd.android.cursor.dir/person”。

如果要操作的数据属于单一数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头,例如:得到id为10的person记录,Uri为content://cn.itcast.provider.personprovider/person/10,那么返回的MIME类型字符串应该为:“vnd.android.cursor.item/person”。

使用ContentResolver操作ContentProvider中的数据:

当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver 类来完成,要获取ContentResolver 对象,可以使用Activity提供的getContentResolver()方法。

ContentResolver类提供了与ContentProvider类相同签名的四个方法:

public Uri insert(Uri uri, ContentValues values)

该方法用于往ContentProvider添加数据。

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

该方法用于从ContentProvider删除数据。

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

该方法用于更新ContentProvider中的数据。

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

该方法用于从ContentProvider中获取数据。

这些方法的第一个参数为Uri,代表要操作的是哪个ContentProvider和对其中的什么数据进行操作,假设给定的是: Uri.parse(“content://cn.itcast.provider.personprovider/person/10”),那么将会对主机名为cn.itcast.provider.personprovider的ContentProvider进行操作,操作的数据为person表中id为10的记录

使用ContentResolver操作ContentProvider中的数据:

使用ContentResolver对ContentProvider中的数据进行添加、删除、修改和查询操作:

 
  1. ContentResolver resolver = getContentResolver();   
  2.   
  3. Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person");   
  4.   
  5. //添加一条记录   
  6.   
  7. ContentValues values = new ContentValues();   
  8.   
  9. values.put("name""itcast");   
  10.   
  11. values.put("age"25);   
  12.   
  13. resolver.insert(uri, values);   
  14.   
  15. //获取person表中所有记录   
  16.   
  17. Cursor cursor = resolver.query(uri, nullnullnull"personid desc");   
  18.   
  19. while(cursor.moveToNext()){   
  20.   
  21. Log.i("ContentTest""personid="+ cursor.getInt(0)+ ",name="+ cursor.getString(1));   
  22.   
  23. }   
  24.   
  25. //把id为1的记录的name字段值更改新为liming   
  26.   
  27. ContentValues updateValues = new ContentValues();   
  28.   
  29. updateValues.put("name""liming");   
  30.   
  31. Uri updateIdUri = ContentUris.withAppendedId(uri, 2);   
  32.   
  33. resolver.update(updateIdUri, updateValues, nullnull);   
  34.   
  35. //删除id为2的记录   
  36.   
  37. Uri deleteIdUri = ContentUris.withAppendedId(uri, 2);   
  38.   
  39. resolver.delete(deleteIdUri, nullnull);  

 

 
  1. public class PersonContentProvider extends ContentProvider{     
  2.     private DataBaseOpenHelper dataBaseOpenHelper;     
  3.     private static final int ALLPERSON=1;     
  4.     private static final int PERSON=2;     
  5.     private static final UriMatcher uriMatcher=new UriMatcher(UriMatcher.NO_MATCH);     
  6.     static{     
  7.         uriMatcher.addURI("com.gao.provider.personprovider""person", ALLPERSON);     
  8.         uriMatcher.addURI("com.gao.provider.personprovider""person/#", PERSON);     
  9.              
  10.     }     
  11.     @Override     
  12.     public int delete(Uri uri, String selection, String[] selectionArgs) {     
  13.         SQLiteDatabase database=dataBaseOpenHelper.getWritableDatabase();     
  14.         int count=0;     
  15.         switch (uriMatcher.match(uri)) {     
  16.         case ALLPERSON://content://com.gao.provider.personprovider/person     
  17.             count=database.delete("person", selection, selectionArgs);     
  18.             break;     
  19.         case PERSON://content://com.gao.provider.personprovider/person/100     
  20.             long id=ContentUris.parseId(uri);     
  21.             String where=TextUtils.isEmpty(selection)?"personid=?":selection+"and personid=?";     
  22.             String[] params=new String[]{String.valueOf(id)};     
  23.             if (!TextUtils.isEmpty(selection)&&selectionArgs!=null) {     
  24.                 params=new String[selectionArgs.length+1];     
  25.                 for (int i = 0; i < selectionArgs.length; i++) {     
  26.                     params[i]=selectionArgs[i];     
  27.                 }     
  28.                 params[selectionArgs.length+1]=String.valueOf(id);     
  29.             }     
  30.             count=database.delete("person", where, selectionArgs);     
  31.             break;     
  32.         default:     
  33.             throw new IllegalArgumentException("Unkonw uri:"+uri);     
  34.         }     
  35.         return count;     
  36.     }     
  37.     @Override     
  38.     public String getType(Uri uri) {     
  39.         switch (uriMatcher.match(uri)) {     
  40.         case ALLPERSON:     
  41.             return "vnd.android.cursor.dir/personprovider.person";     
  42.         case PERSON:     
  43.             return "vnd.android.cursor.item/personprovider.person";     
  44.         default:     
  45.             break;     
  46.         }     
  47.         return null;     
  48.     }     
  49.     @Override     
  50.     public Uri insert(Uri uri, ContentValues values) {     
  51.         SQLiteDatabase database=dataBaseOpenHelper.getWritableDatabase();     
  52.         long id=0;     
  53.         switch (uriMatcher.match(uri)) {     
  54.         case ALLPERSON://content://com.gao.provider.personprovider/person     
  55.             id=database.insert("person""name", values);//返回记录的行号,主键是int,实际上就是主键值     
  56.             return ContentUris.withAppendedId(uri, id);     
  57.         case PERSON://content://com.gao.provider.personprovider/person/100     
  58.             id=database.insert("person""name", values);     
  59.             String path=uri.toString();     
  60.             return Uri.parse(path.substring(0, path.lastIndexOf("/"))+"id");     
  61.         default:     
  62.             throw new IllegalArgumentException("Unkonw uri:"+uri);     
  63.         }     
  64.     }     
  65.     @Override     
  66.     public boolean onCreate() {     
  67.         dataBaseOpenHelper=new DataBaseOpenHelper(this.getContext());     
  68.         return false;     
  69.     }     
  70.     @Override     
  71.     public Cursor query(Uri uri, String[] projection, String selection,     
  72.             String[] selectionArgs, String sortOrder) {     
  73.         SQLiteDatabase database=dataBaseOpenHelper.getReadableDatabase();     
  74.         switch (uriMatcher.match(uri)) {     
  75.         case ALLPERSON:     
  76.             database.query("person", projection, selection, selectionArgs, nullnull, sortOrder);     
  77.             break;     
  78.         case PERSON:     
  79.             long id=ContentUris.parseId(uri);     
  80.             String where=TextUtils.isEmpty(selection)?"personid=?":selection+"and personid=?";     
  81.             String[] params=new String[]{String.valueOf(id)};     
  82.             if (!TextUtils.isEmpty(selection)&&selectionArgs!=null) {     
  83.                 params=new String[selectionArgs.length+1];     
  84.                 for (int i = 0; i < selectionArgs.length; i++) {     
  85.                     params[i]=selectionArgs[i];     
  86.                 }     
  87.                 params[selectionArgs.length+1]=String.valueOf(id);     
  88.             }     
  89.             database.query("person", projection, where, params, nullnull, sortOrder);     
  90.             break;     
  91.         default:     
  92.             break;     
  93.         }     
  94.         return null;     
  95.     }     
  96.     //update("content://com.gao.provider.personprovider/person/100",values,"name like ? and ...",new String[]{"%gao%"});     
  97.     @Override     
  98.     public int update(Uri uri, ContentValues values, String selection,     
  99.             String[] selectionArgs) {     
  100.         SQLiteDatabase database=dataBaseOpenHelper.getWritableDatabase();     
  101.         int count=0;     
  102.         switch (uriMatcher.match(uri)) {     
  103.         case ALLPERSON://content://com.gao.provider.personprovider/person     
  104.             count=database.update("person", values, selection,selectionArgs);     
  105.             break;     
  106.         case PERSON://content://com.gao.provider.personprovider/person/100     
  107.             long id=ContentUris.parseId(uri);     
  108.             String where=TextUtils.isEmpty(selection)?"personid=?":selection+"and personid=?";     
  109.             String[] params=new String[]{String.valueOf(id)};     
  110.             if (!TextUtils.isEmpty(selection)&&selectionArgs!=null) {     
  111.                 params=new String[selectionArgs.length+1];     
  112.                 for (int i = 0; i < selectionArgs.length; i++) {     
  113.                     params[i]=selectionArgs[i];     
  114.                 }     
  115.                 params[selectionArgs.length+1]=String.valueOf(id);     
  116.             }     
  117.             count=database.update("person", values, where,params);     
  118.             break;     
  119.         default:     
  120.             throw new IllegalArgumentException("Unkonw uri:"+uri);     
  121.         }     
  122.         return count;     
  123.     }     
  124. }    

 

AndroidManifest.xml:

 
  1. <provider android:name="PersonContentProvider"  
  2.   
  3. android:authorities="com.gao.provider.personprovider" />  

在另一个程序ContentProviderUser中使用上面的内容提供者:

 

 
  1. public void onCreate(Bundle savedInstanceState) {     
  2. super.onCreate(savedInstanceState);     
  3.        setContentView(R.layout.main);     
  4.        ContentResolver contentResolver=this.getContentResolver();     
  5.        Uri allUri=Uri.parse("content://com.gao.provider.personprovider/person");     
  6.        ContentValues values=new ContentValues();     
  7.        values.put("name""GGGGG");     
  8.        values.put("age"19);     
  9.        contentResolver.insert(uri, values);     
  10.        values.put("name""CCCCCC");     
  11.        values.put("age"100);     
  12.        Uri uri=Uri.parse("content://com.gao.provider.personprovider/person/9");     
  13. // contentResolver.update(uri, values, null, null);   
  14. //contentResolver.delete(uri, null, null);   
  15.        Cursor cursor=contentResolver.query(uri, new String[]{"personid","name","age"}, nullnull"personid desc");     
  16. while (cursor.moveToNext()) {     
  17.         Log.i(TAG, "psrsonid:"+cursor.getInt(0)+",name:"+cursor.getString(1)+",age"+cursor.getInt(2));     
  18.     }     
  19.        cursor.close();    

posted @ 2013-10-04 15:48  KillerLegend  Views(1232)  Comments(0Edit  收藏  举报