码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2015-03-31 00:51:01      阅读:241      评论:0      收藏:0      [点我收藏+]

标签:

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

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

标签:

原文地址:http://www.cnblogs.com/mzsoft/p/4379622.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!