##简介##
用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序的数据,同时保证被访数据的安全性,使用ContentProvider是Android实现跨程序共享数据的标准方式。不同于文件存储和SharedPreferences,ContentProvider可以选择只对哪一部分数据进行共享。
##ContentProvider用法##
-
使用现有的ContentProvider来读取和操作相应程序中的数据。
-
创建自己的ContentProvider给我们的程序的数据提供外部访问接口。
##ContentResolver用法##
对于每一个应用程序来说,如果想要访问ContentProvider中共享的数据,就一定要借助ContentResolver类,可以通过Content中的getContentResolver()方法获取到改类的实例。ContentResolver提供了一系列的方法用于对数据进行CRUD操作。
-
insert()插入
-
update()更新
-
delete()删除
-
query()查询
不同于SqLiteDatabase,ContentResolver中的增删改查不接收表名参数,而是使用一个Uri参数代替,这个参数被称为内容URI。内容URI给ContentProvider中的数据建立了唯一标识符,主要由两部分组成:authority和path。
-
authority:用于对不同的应用程序做区分的,一般会采用程序包名进行命名。比如某个程序的包名是com.example.app,那么该程序的authority可以命名为:com.example.app.provider。
-
path:则是用于对同一应用程序中不同的表做区分的,通常添加到authority后面,比如某个程序的数据库有2张表,table1和table2,path分别命名为/table1和/table2,然后把authority和path进行组合,内容URI就变成了com.example.app.provider/table1和com.example.app.provider/table2,
最后在头部加上协议声明就可以了。
content://com.example.app.provider/table1
content://com.example.app.provider/table2
在得到了内容URI字符串后,需要将他解析成Uri对象才可以作为参数传入。
Uri uri=Uri.parse("content://com.example.app.provider/table1");
##查询##
现在就可以使用这个Uri对象来查询table1表中的数据了。
Cursor cursor=getContentResolver().query(
uri,
projection,
selection,
selectionArgs,
sortOrder);
这些参数和SQLiteDatabase中query()方法里的参数很像。
query()参数 | 对应SQL部分 | 描述 |
uri | from table_name | 指定查询某个应用程序下的某一张表 |
projection | select column1,column2 | 指定查询的列名 |
selection | where column=value | 指定where的约束条件 |
selectionArgs | - | 为where中的占位符提供具体的值 |
sortOrder | order by column1,column2 | 指定查询结果的排序方式 |
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);
##更新##
把column1的值清空
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跨程序共享数据(二)