Android学习笔记(四九):通过Content Provider访问数据

在上次笔记中,我们编写了自己的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开发相关文章

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值