1.ContentResolver
对于每一个应用程序来说,如果想要访问内容提供器(ContentProvider)中共享的数据,就一定要借助ContentResolver类。可以通过Context中的getContentResolver()方法获取该类的实例。
ContentResolver中提供了一系列的方法用于对数据进行CRUD操作,这些方法都是接收Uri参数的,这个参数被称为内容URI。内容URI主要由两部分组成:authority和path,最标准的格式写法如下:content://com.futuring.app.provider/table。其中,content为协议;com.futuring.app.provider为包名;table为表名。
在得到了内容URI字符串之后,还需要将它解析成Uri对象才可作为参数传入:
Uri uri = Uri.parse("content://com.futuring.app.provider/table")
ContentResolver中的CRUD操作:
查:getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder)
query()方法参数 | 对应SQL部分 | 描述 |
---|---|---|
uri | form table_name | 指定查询某个应用程序下的某一张表 |
projection | select column1, column2 | 指定查询的列名 |
selection | where column = value | 指定where的约束条件 |
selectionArgs | - | 为where中的占位符提供具体的值 |
orderBy | order by column1, column2 | 指定查询结果的排列方式 |
Cursor cursor = null;
try{
cursor = getContentResolver().query(uri, projection, selection, selectionArgs, orderBy);
if(cursor != null) {
while(cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndex("name"));
int id = cursor.getInt(cursor.getColumnIndex("id"));
}
}
} catch(Exception e) {
e.printStackTrace();
} finally {
if(cursor != null) {
cursor.close();
}
}
增:getContentResolver().insert(uri, values)
ContentValues values = new ContentValues();
valuse.put("column1", "text");
valuse.put("column2", 1);
getContentResolver().insert(uri, values);
改:getContentResolver().update(uri, values, selection, selectionArgs)
//将cloumn1 = text, cloumn2 = 1 这条数据中的text改为changed
ContentValues values = new ContentValues();
values.put("column1", "changed");
getContentResolver().update(uri, values, "cloumn1 = ? and column2 = ?",
new String[] {"text", "1"});
删:getContentResolver().delete(uri, selection, selectionArgs)
getContentResolver().update(uri, "column2 = ?", new String[] {"1"});
2.使用现有的ContentProvider来读取和操作数据
例:读取联系人信息
Cursor cursor = null;
try{
//查询联系人数据
cursor = getContentResolver().query(ContactsContract.CommonDataKinds
.Phone.CONTENT_URI, null, null, null, null);
if(cursor != null) {
while(cursor.moveToNext()) {
String displayName= cursor.getString(cursor.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String number = cursor.getInt(cursor.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.NUMBER));
}
}
} catch(Exception e) {
e.printStackTrace();
} finally {
if(cursor != null) {
cursor.close();
}
}
ContactsContract.CommonDataKinds.Phone类已经封装了一个CONTENT_URI常量,这个常量就是使用Uri.parse()方法解析出来的。
网友评论