Android数据持久化的技术,包括文件存储、SharedPreferences存储、以及数据库存储。但是这三种存储方式只能在当前应用中访问。因此Content Provider提供了不同应用程序之间实现数据共享的功能。下面简单介绍一下如何使用:
1.用法:
1)使用现有的内容提供器来读取和操作相应程序中的数据
2)创建自己的内容提供器给我们程序的的数据提供外部访问接口
2.访问其他程序中的数据:ContentResolver
ContentResolver提供了一系列的方法用于对数据进行CRUD操作,其增删改查方法不接收表名参数,使用Uri参数,这个参数成为内容URI,它主要由两部分组成,权限和路径。标准的格式写法如下:content://com.example.app.provider/table(权限:content://com.example.app.provider,路径:table,table为数据库的数据表)。
得到内容URI后,要解析成Uri对象才可以做为参数传入:Uri uri = Uri.parse("content://com.example.app.provider/table")
1) 得到Uri对象后,可以使用这个对象来查询table表中的数据
Cursor cursor = getContentResolver().query(uri,projection,selection,selectionArgs,sortOrder)
得到cursor对象后,取出数据
while(cursor.moveToNext()){
String column = curcor.getString(cursor.getColunmIndex("column"));
} curcor.close();
2) 向table表添加一条数据
ContentValues cv = new Contentvalues();
cv.put("column","text");
getContentResolver().insert(uri, cv);
3) 更新数据
ContentValues cv = new Contentvalues();
cv.put("column","");
getContentResolver().update(uri, cv,"column = ?",new String[]{"change"});
4) 删除数据
getContentResolver().detele(uri,"column = ?",new String[]{"change"})
3.例子:读取系统联系人(此处主函数省略,提供一个按钮用于点击)
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btn_4:
Intent intent = new Intent(this,CPActivity.class);
startActivity(intent);
break;
}
}
public class CPActivity extends Activity{
private ListView contactsListView;
private ArrayAdapter<String> adapter;
List<String> list = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cp); //在xml文件中只需一个ListView用于显示读取到的联系人信息即可
contactsListView = (ListView)findViewById(R.id.list_contacts);
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,list);
contactsListView.setAdapter(adapter);
getContacts();
}
private void getContacts(){
Cursor cursor =null;
try{
cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null);
while (cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String num = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
list.add(name+" : "+num);
}
}catch (Exception e){
e.printStackTrace();
}finally {
if(cursor != null){
cursor.close();
}
}
}
}
4.创建自己的内容提供器要点
1) 新建一个类去继承ContentProvider,然后重写其六个抽象方法,其中getType()方法用于获取Uri对象岁对应的MIME类型
2) UriMatcher: 提供addURI()方法,接收三个参数,分别把权限、路径和一个自定义代码传入
uriMatcher.addURI("权限", "路径", "自定义代码");
swicth(uriMatcher.match(uri)){
case 自定义代码:
//操作
}
3) MIME类型例:
URI : content://com.example.app.provider/table
MIME : vnd.android,cursor.dir/vnd.com.example.app.provider.table
完善getType() :
swicth(uriMatcher.match(uri)){
case 自定义代码:
return "vnd.android,cursor.dir/vnd.com.example.app.provider.table"; //操作
}