【用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.providers.personprovider/person/10”),那么将会对主机名为cn.itcast.providers.personprovider的ContentProvider进行操作,操作的数据为person表中id为10的记录。
//--------------------------------------------------
使用ContentResolver对ContentProvider中的数据进行添加、删除、修改和查询操作:
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person");
//添加一条记录
ContentValues values = new ContentValues();
values.put("name", "itcast");
values.put("age", 25);
resolver.insert(uri, values);
//获取person表中所有记录
Cursor cursor = resolver.query(uri, null, null, null, "personid desc");
while(cursor.moveToNext()){
Log.i("ContentTest", "personid="+ cursor.getInt(0)+ ",name="+ cursor.getString(1));
}
//把id为1的记录的name字段值更改新为liming
ContentValues updateValues = new ContentValues();
updateValues.put("name", "liming");
Uri updateIdUri = ContentUris.withAppendedId(uri, 2);
resolver.update(updateIdUri, updateValues, null, null);
//删除id为2的记录
Uri deleteIdUri = ContentUris.withAppendedId(uri, 2);
resolver.delete(deleteIdUri, null, null);
//-------------------------------------------------

1 package cn.itcast.db; 2 3 import android.content.ContentProvider; 4 import cn.itcast.service.DBOpenHelper; 5 import android.content.ContentUris; 6 import android.content.ContentValues; 7 import android.content.UriMatcher; 8 import android.database.Cursor; 9 import android.database.sqlite.SQLiteDatabase; 10 import android.net.Uri; 11 12 public class PersonProvider extends ContentProvider { 13 private DBOpenHelper dbOpenHelper; 14 private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH); 15 private static final int PERSONS = 1; 16 private static final int PERSON = 2; 17 static{ 18 MATCHER.addURI("cn.itcast.providers.personprovider", "person", PERSONS); 19 MATCHER.addURI("cn.itcast.providers.personprovider", "person/#", PERSON); 20 } 21 @Override 22 public boolean onCreate() { 23 dbOpenHelper = new DBOpenHelper(this.getContext()); 24 return true; 25 } 26 27 @Override 28 public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { 29 SQLiteDatabase db = dbOpenHelper.getReadableDatabase(); 30 switch (MATCHER.match(uri)) { 31 case PERSONS: 32 return db.query("person", projection, selection, selectionArgs, null, null, sortOrder); 33 34 case PERSON: 35 long rowid = ContentUris.parseId(uri); 36 String where = "personid="+ rowid; 37 if(selection!=null && !"".equals(selection.trim())){ 38 where += " and "+ selection; 39 } 40 return db.query("person", projection, where, selectionArgs, null, null, sortOrder); 41 default: 42 throw new IllegalArgumentException("this is Unknown Uri:"+ uri); 43 } 44 } 45 46 @Override 47 public String getType(Uri uri) { 48 switch (MATCHER.match(uri)) { 49 case PERSONS: 50 return "vnd.android.cursor.dir/person"; 51 case PERSON: 52 return "vnd.android.cursor.item/person"; 53 default: 54 throw new IllegalArgumentException("this is Unknown Uri:"+ uri); 55 } 56 } 57 58 @Override 59 public Uri insert(Uri uri, ContentValues values) { 60 SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); 61 switch (MATCHER.match(uri)) { 62 case PERSONS: 63 long rowid = db.insert("person", "name", values);//主键值 64 // content://cn.itcast.provides.personprovider/person/10 65 Uri insertUri = ContentUris.withAppendedId(uri, rowid); 66 this.getContext().getContentResolver().notifyChange(uri, null);//发出数据变化通知 67 return insertUri; 68 69 default: 70 throw new IllegalArgumentException("this is Unknown Uri:"+ uri); 71 } 72 } 73 74 @Override 75 public int delete(Uri uri, String selection, String[] selectionArgs) { 76 SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); 77 int num = 0; 78 switch (MATCHER.match(uri)) { 79 case PERSONS: 80 num = db.delete("person", selection, selectionArgs); 81 break; 82 case PERSON: 83 long rowid = ContentUris.parseId(uri); 84 String where = "personid="+ rowid; 85 if(selection!=null && !"".equals(selection.trim())){ 86 where += " and "+ selection; 87 } 88 num = db.delete("person", where, selectionArgs); 89 break; 90 default: 91 throw new IllegalArgumentException("this is Unknown Uri:"+ uri); 92 } 93 return num; 94 } 95 96 @Override 97 public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { 98 SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); 99 int num = 0; 100 switch (MATCHER.match(uri)) { 101 case PERSONS: 102 num = db.update("person", values, selection, selectionArgs); 103 break; 104 case PERSON: 105 long rowid = ContentUris.parseId(uri); 106 String where = "personid="+ rowid; 107 if(selection!=null && !"".equals(selection.trim())){ 108 where += " and "+ selection; 109 } 110 num = db.update("person", values, where, selectionArgs); 111 break; 112 default: 113 throw new IllegalArgumentException("this is Unknown Uri:"+ uri); 114 } 115 return num; 116 } 117 118 }

1 package cn.itcast.test; 2 3 import android.content.ContentResolver; 4 import android.content.ContentValues; 5 import android.database.Cursor; 6 import android.net.Uri; 7 import android.test.AndroidTestCase; 8 import android.util.Log; 9 10 public class AccessContentProviderTest extends AndroidTestCase { 11 private static final String TAG = "AccessContentProviderTest"; 12 13 public void testInsert() throws Exception{ 14 Uri uri = Uri.parse("content://cn.itcast.providers.personprovider/person"); 15 ContentResolver resolver = this.getContext().getContentResolver(); 16 ContentValues values = new ContentValues(); 17 values.put("name", "laoli"); 18 values.put("phone", "1860103838383"); 19 values.put("amount", "50000000000"); 20 resolver.insert(uri, values); 21 } 22 23 public void testDelete() throws Exception{ 24 Uri uri = Uri.parse("content://cn.itcast.providers.personprovider/person/20"); 25 ContentResolver resolver = this.getContext().getContentResolver(); 26 resolver.delete(uri, null, null); 27 } 28 29 public void testUpdate() throws Exception{ 30 Uri uri = Uri.parse("content://cn.itcast.providers.personprovider/person/1"); 31 ContentResolver resolver = this.getContext().getContentResolver(); 32 ContentValues values = new ContentValues(); 33 values.put("name", "zhangxiaoxiaolove"); 34 resolver.update(uri, values, null, null); 35 } 36 37 public void testQuery() throws Exception{ 38 Uri uri = Uri.parse("content://cn.itcast.providers.personprovider/person"); 39 ContentResolver resolver = this.getContext().getContentResolver(); 40 Cursor cursor = resolver.query(uri, null, null, null, "personid asc"); 41 while(cursor.moveToNext()){ 42 String name = cursor.getString(cursor.getColumnIndex("name")); 43 Log.i(TAG, name); 44 } 45 cursor.close(); 46 } 47 }