在上次笔记中,我们编写了自己的Provider,这次笔记,我们将通过Content Provider的Uri接口对数据进行访问,重写Android学习笔记(四二)中例子。在这里我们不在充分描述相关UI如何编写,可以到笔记(四二)中详细查看,重点讲述如何实现数据的访问。
读取信息
读取信息方式,在笔记(四七)中已经介绍,代码如下
private voidread(){
/* 通过managedQuery读取,第1参数表示URI, 第2参数表示所需读取的信息,第3个参数是限制条件,类似SQL中的WHERE;第4个参数和第3个参数配合使用,具体支持第三个参数中的“?”具体为何;第5个参数类似于SQL中的ORDER BY。如果我们是读取具体的instance,而不是collect,可以设置Uri uri = ContentUris.withAppendedId(GravityProvider.Constants.CONTENT_URI,2); */
Cursor cursor = managedQuery( GravityProvider.Constants.CONTENT_URI,PROJECTION,null,null,null);
if(adapter == null){
adapter = new SimpleCursorAdapter(this,R.layout.chapter_22_test1,
cursor,
new String[]{GravityProvider.Constants.TITLE,GravityProvider.Constants.VALUE},
new int[]{R.id.c22_name,R.id.c22_gravity});
setListAdapter(adapter);
}else{
adapter.changeCursor(cursor);
constantsCursor.close();
}
constantsCursor = cursor;
}
同步信息
Content Provider可以有多个应用进行访问,应用可以对数据进行增删,其他应用也可以对数据进行增删,Provider提供提供一种通知机制,在Uri指向数据发生改变时,通知客户端,允许客户端进行实时同步。
//步骤1(A):定义处理通信的ContentObserver对象
private ContentObserver observer = null;
//步骤3:注销,取笑某Uri数据发生变化的通知
protected void onPause() {
...... ......
getContentResolver().unregisterContentObserver(observer);
observer = null;
}
//步骤2:注册,要求某Uri的数据发生变化时通知
protected void onResume() {
...... ......
observer = new MyObserver();
getContentResolver().registerContentObserver(GravityProvider.Constants.CONTENT_URI, true,observer);
}
//步骤1(B):ContentOberver是一个抽象类,我们需要定义自己收到通知的处理
private class MyObserver extends ContentObserver{
public MyObserver(){
super(new Handler());
}
//具体描述收到Provider的通知如何处理,在本例,只需刷新列表即可
public void onChange(boolean selfChange) {
super.onChange(selfChange);
read();
}
}
增加数据
增加数据的Uri必须是CollectionUri,有insert( )和bulkInsert( )两个接口,前者是加一个instance,后者是通过array加多个。
private void addData(DialogWrapper wrapper){
ContentValues cv = new ContentValues(2);
cv.put(GravityProvider.Constants.TITLE, wrapper.getTitle());
cv.put(GravityProvider.Constants.VALUE, wrapper.getGravity());
getContentResolver().insert(GravityProvider.Constants.CONTENT_URI, cv);
}
删除数据
删除数据采用delete,可以是instance的Uri,也可以是collection。
Uri uri = ContentUris.withAppendedId(GravityProvider.Constants.CONTENT_URI, rowId);
getContentResolver().delete(uri, null, null);
注意BLOB
BLOB(Binary Large Objects),例如一些图片信息,可以在很多数据库,包括SQLite中支持。Content Provider不能同通过cursor直接访问在这些binary数据,可以在ContentProvider上使用getInputStream()和getOutpurStream()来读写二进制信息。对于image,Andriod不需要将数据copy出来放在某处,然后显示,可以直接实现Uri来显示。
从其他应用访问
我们可以在一个应用中不同的activity进行数据访问,当更常见的情况是在其他应用中访问。经试验,数据访问成功。
相关链接: 我的Android开发相关文章