内容提供器 ContentProvider 是 Android 实现跨程序共享数据的标准方式。
ContentResolver
如果想要访问 ContentProvider 的数据,需要借助 ContentResolve 类。
我们可以通过 Context 的 getContentResolver() 方法获取到该类的 ContentResolve 实例。
Uri
ContentResolver 中的增删改查方法都接收 Uri 参数,Uri 由两部分组成:权限 ( authority )和路径 ( path ) 。
URI 标准格式:content://com.example.app.provider/table1
得到了 URI 字符串后,我们需要将它解析成Uri 对象才可以作为参数传入,只需调用 Uri.parse() 即可。
Uri uri = Uri.parse("content://com.example.app.provider/table1")
query()
现在我们就可以使用这个 Uri 对象来查询 table1 表中的数据了:
Cursor cursor = getContentResolver().query( uri, projection, selection, selectionArgs, sortOrder);
查询完成后,返回的仍然是一个Cursor 对象,我们只需要把数据从 Cursor 对象中逐个读取出来了。
<span style="font-size:14px;">if (cursor != null) {
while (cursor.moveToNext()) {
String column1 = cursor.getString(cursor.getColumnIndex("column1"));
int column2 = cursor.getInt(cursor.getColumnIndex("column2"));
}
cursor.close();
}</span>
insert()
掌握了最难的查询操作,剩下的增加、修改、删除操作就更不在话下了。
我们先来看看如何向 table1 表中添加一条数据,代码如下所示:
ContentValues values = new ContentValues();
values.put("column1", "text");
values.put("column2", 1);
getContentResolver().insert(uri, values);
将待添加的数据组装到 ContentValues 中,然后调用 insert() 方法,将 Uri 和 ContentValues 作为参数传入即可。
update()
ContentValues values = new ContentValues();
values.put("column1", "");
getContentResolver().update(uri, values, "column1 = ? and column2 = ?", new String[] {"text", "1"});
注意上述代码使用了selection 和 selectionArgs 参数来对想要更新的数据进行约束,以防止所有的行都会受影响。
delete()
最后,我们可以调用 ContentResolver 的delete() 方法将这条数据删除掉。
getContentResolver().delete(uri, "column2 = ?", new String[] { "1" });
创建自己的内容提供器
public class MyProvider extends ContentProvider {
@Override
public boolean onCreate() {
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
return null;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
return 0;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
return 0;
}
@Override
public String getType(Uri uri) {
return null;
}
}
ContentPrivider 六方法
1 onCreate() 初始化
public boolean onCreate()
通常完成数据库的创建和升级等操作。
只有 ContentResolver 尝试访问数据时,才会调用onCreate() 。
2 query() 查询数据
public Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder)
uri 确定查询哪张表
projection 确定查询哪些列
selection 和 selectionArgs 约束查询哪些行
sortOrder 对结果进行排序
查询的结果存放在Cursor 对象中返回
3 insert() 添加数据
public Uri insert(Uri uri, ContentValues values)
uri 确定要添加到哪张表
values 待添加数据参数中
添加完成后,返回一个用于表示这条新记录的 URI 。
4 update() 更新数据
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
uri 确定表
values 新数据
selection 和 selectionArgs 约束更新哪些行
被更新的行的行数会被返回。
5 delete()
public int delete(Uri uri, String selection, String[] selectionArgs)
uri 确定表
selection 和 selectionArgs 约束删除哪些行
被删除的行的行数会被返回。
6 getType()
public String getType(Uri uri)
根据传入的 URI 返回相应的 MIME 类型。