前言: 我们的选择决定我们的生活内容,接触的领域也是如此.今天我带大家打算了解这个四大组件之一的内容提供者.
它的核心功能是用于实现应用程序间的数据共享,同时能保证被访问数据的安全性,目前
它是android实现跨程序共享数据的标准模式.
ContentResolver如何用?
ContentProvider就像一个掌握共享数据的仓库,如果要拿这些共享数据,必然要借助什么东西去拿了,
它就是 ContentResolver,它里面提供了一系列方法对这些共享数据进行增删改查的操作,
insert 增加数据
update 更新
delete 删除数据
query 查询数据
这么看,这家伙和sqlitedatabase比较相似.不过ContentResolver增删改查不需要接收表名,而是使用uri代替,
这个参数叫所谓的内容URL.这个内容URL就像ContentProvider中共享数据的id或者唯一标识符一样,组成
是:
authority+path
前者用于区别应用程序,后者用于对应用程序中的不同表做区分的.内容提供者格式写法如下:
content://com.xxx.app.provider/table
ContentProvider得到这些内容URI字符串后,我们还需要将它解析成Uri对象才可以作为参数传入.也就是我们要去仓库(ContentProvider)取东西,取东西的人必须要登记验证(转为Uri对象).
Uri uri =Uri.parse("content://com.xxx.app.provider/table");
验证后,我们就要去仓库去数据了,
Cursor cursor = getContentResolver().query(uri,projection,selection,selectionArgs,sortOrder);
uri from table_name 指定查询某个应用程序下的一张表
projection select column1,column2 指定查询的列名
selection where column = value 指定where的约束条件
orderBy order by column1,column2 指定查询结果的排序方式
查询完后,返回的是一个cursor对象,这时我们就从cursor对象中逐个读取数据了,读取的思路是通过移动游标的位置遍历cursor的所有行,然后再取出每一行相应列的数据.书中查询数据代码实例:
if(cursor!=null){
while(cursor.moveToNext()){
String column1 = cursor.getString(cursor.getColumnIndex("column1"));
int column2 = cursor.getInt(cursor.getColumnIndex("column2"));
}
cursor.close();
}
增加(插入)数据:
ContentValues values = new ContentValues();
values.put("column1","text");
values.put("column2",1);
getContentResolver().insert(uri,values);
更新(修改)数据:
ContentValues values = new ContentValues();
values.put("column1","");
getContentResolver().update(uri,values,"column1=? and column2 = ?",new String[]{"text,"1"});
删除数据:
getContentResolver().delete(uri,"column2=?",new String[]{"1"});
接下来我们学习自定义的ContentProvider,新建一个类去继承ContentProvider.ContentProvider类中有
6个抽象方法,需要将6个方法进行重写,分别是:
onCreate boolean 初始化内容提供者时调用
query Cursor 查询数据
insert Uri 使用uri参数来确定要添加的表,待添加的数据保存在values参数中. 返回一个用于表示这条记录的URI.
update int 使用uri参数来确定要更新的表,新数据保存在values参数中,selection
和selectionArgs参数用于约束更新哪些行,受影响的行数将作为返回值返回.
delete int 从内容提供者删除数据.使用uri参数来确定要删除的表中的数据,
selection和selectionArgs参数用于约束删除哪些行,被删除的行数将作为返回值返回.
getType String 我们传入一个内容URI来返回相应的MINE类型
最后,记得在AndroidMainifest.xml中注册内容提供者.