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开发相关文章

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。