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

时间: 2024-10-21 06:03:42

Android学习笔记(四九):通过Content Provider访问数据的相关文章

Citrix XenMobile学习笔记之六:XenMoble业务访问数据流程

总体访问流程图 终端设备注册流程 Android设备注册流程 到google Play或亚马逊应用商店或者豌豆荚.Citrix官网,下载思杰Worx Home应用.并在设备上安装. 当系统提示您安装该应用程序,单击下一步,然后单击安装. 安装Worx Home之后,点击启动. 输入您的认证信息,如设备管理器服务器名,用户主体名称(UPN),或电子邮件地址的名称,然后单击下一步. 在激活设备管理员屏幕上,点击激活. 输入您的账户密码,然后点击点登录. 根据XenMobile的配置方式,您可能会被要

【转】Pro Android学习笔记(五):了解Content Provider(上)

Content Provider是抽象数据封装和数据访问机制,例如SQLite是Android设备带有的数据源,可以封装到一个content provider中.要通过content provider进行读写,需要使用URI.推荐阅读Android学习笔记(四七):Content Provider初谈和Android联系人信息.Android学习笔记(四八):提供自己的Content Provider和Android学习笔记(四九):通过Content Provider访问数据.Content

Android学习笔记(五十):声明、请求和检查许可

基于安全需求,应用对Android系统提供的content provider或者service的访问需要在安装时进行许可,这就是AndroidManifest.xml文件中的permission中声称,之前已经很多例子.同样如果其他应用要访问我们的数据,我们也可以要求这些应用必须获得用户授权方可访问我们的数据. 申请授权:请求permission 申请许可的格式为 <uses-permission android:name="android.permission.ACCESS_LOCATI

Android学习笔记(四七):Content Provider初谈和Android联系人信息

Content Provider 在数据处理中,Android通常使用Content Provider的方式.Content Provider使用Uri实例作为句柄的数据封装的,很方便地访问地进行数据的增.删.改.查的操作.Android并不提供所有应用共享的数据存储,采用content Provider,提供简单便捷的接口来保持和获取数据,也可以实现跨应用的数据访问.简单地说,Android通过content Provider从数据的封装中获取信息. Content provider使用Uri

Android学习笔记(四八):提供自己的Content Provider

在上一次的学习中,采用了原生的内容提供者Contact,Contact有多层映射关系,比较复杂,并非作为小例子的好选择,在本次学习中,我们将学习如何建立Content Provider,并通过Uri进行增删改查.如果应用的数据只需自己使用,并不需要content provider,相反避免这样做,可直接访问数据:但是若希望数据可以被其他应用访问,创建content provider就是常规手段. 再谈Content Provider的Uri 在上一次学习中,我们谈到了Uri的格式.现在已cont

【转】Pro Android学习笔记(七):了解Content Provider(下上)

我们通过一个Content Provider小例子进行详细说明.数据源是一个SQLite数据库,名字为books.db,该数据库只含有一个表格,名字为books.表格中含有name,isbn,author,created_date和modified_date几列.我们通过一个名为BookProvider的内容提供者将数据源运行封装,并对外提供增删改查的接口. 首先:定义Content Provider的结构 创建一个Provider,我们首先需要定义好这个provider的结构.通过consta

【转】Pro Android学习笔记(八):了解Content Provider(下中)

在之前提供了小例子BookProvider,我们回过头看看如何将通过该Content Provider进行数据的读取. (1)增加 private void addBook(String name ,String isbn,String author){    /* 从ContentProvider的insert()方法的参数可以看到,通过ContentValues来进行数据的传递.ContentValues是key/values对,可以存储多个组,非常适合传递信息 */    ContentV

Android学习笔记(四三):文件访问

之前我们学习了通过preference和SQLite数据库进行数据存储,也可以通过文件方式.文件可以是在应用打包时预置,也可以是应用所生成. 文件访问有两种方式:一:静态数据的文件可以防止在res/raw中,这些文件是只读的,只有在应用版本升级的时候进行修改,或者我们先读出这些数据,通过 reference的方式来处理,这样以后可以进行修订,但是这种方式,会有两份数据保存.二:另一种方式是通过URL访问文件,动态数据的读取也可以采用SQLite3的方式. res/raw/下静态文件的读取 在re

Android学习笔记——文件路径(/mnt/sdcard/...)、Uri(content://media/external/...)学习

一.URI 通用资源标志符(Universal Resource Identifier, 简称"URI"). Uri代表要操作的数据,Android上可用的每种资源 - 图像.视频片段等都可以用Uri来表示. URI一般由三部分组成: 访问资源的命名机制. 存放资源的主机名. 资源自身的名称,由路径表示. Android的Uri由以下三部分组成: "content://".数据的路径.标示ID(可选) 举些例子,如: 所有联系人的Uri: content://con