Android中ContentProvider简介

来源:互联网 发布:淘宝联盟设置推广位 编辑:程序博客网 时间:2024/05/16 09:38

1.什么是ContentProvider
 数据库在Android
当中是私有的,当然这些数据包括文件数据和数据库数据以及一些其他类型的数据。
 不能将数据库设为
WORLD_READABLE
,每个数据库都只能创建它的包访问,
 这意味着只有由创建数据库的进程可访问它。如果需要在进程间传递数据,
 则可以使用
AIDL/Binder或创建一个ContentProvider
,但是不能跨越进程/包边界直接来使用数据库。
 一个
Content Provider类实现了一组标准的方法接口,从而能够让其他的应用保存或读取此Content Provider
的各种数据类型。
 也就是说,一个程序可以通过实现一个
Content Provider
的抽象接口将自己的数据暴露出去。
 外界根本看不到,也不用看到这个应用暴露的数据在应用当中是如何存储的,或者是用数据库存储还是用文件存储,还是通过网上获得,这些一切都不重要,
 重要的是外界可以通过这一套标准及统一的接口和程序里的数据打交道,可以读取程序的数据,也可以删除程序的数据,
 当然,中间也会涉及一些权限的问题。下边列举一些较常见的接口,这些接口如下所示

·  query(Uri uri, String[] projection, String selection, String[] selectionArgs,String sortOrder):通过Uri进行查询,返回一个Cursor。
·  insert(Uri url, ContentValues values):将一组数据插入到Uri 指定的地方。
·  update(Uri uri, ContentValues values, String where, String[] selectionArgs):更新Uri指定位置的数据。
·  delete(Uri url, String where, String[] selectionArgs):删除指定Uri并且符合一定条件的数据。
2.什么是ContentResolver
外界的程序通过ContentResolver接口可以访问ContentProvider提供的数据,在Activity当中通过getContentResolver()可以得到当前应用的 ContentResolver
实例。
 ContentResolver提供的接口和ContentProvider中需要实现的接口对应,主要有以下几个。

·  query
(Uri uri, String[] projection, String selection, String[] selectionArgs,String sortOrder):通过Uri进行查询,返回一个Cursor。
·  
insert(Uri url, ContentValues values):将一组数据插入到Uri 指定的地方。
·  update(Uri uri, ContentValues values, String where, String[] selectionArgs):更新Uri指定位置的数据。
·  delete(Uri url, String where, String[] selectionArgs):删除指定Uri并且符合一定条件的数据。
3.ContentProvider和ContentResolver中用到的Uri
在ContentProvider和 ContentResolver当中用到了Uri的形式通常有两种,一种是指定全部数据,另一种是指定某个ID的数据。
我们看下面的例子。

·  content://contacts/people/  这个Uri指定的就是全部的联系人数据。
·  content://contacts/people/1 这个Uri指定的是ID为1的联系人的数据。 
在上边两个类中用到的Uri一般由3部分组成。
·  第一部分是方案:"content://" 这部分永远不变
·  第二部分是授权:"contacts"
·  第二部分是路径:"people/","people/1"(如果没有指定ID,那么表示返回全部)。
由于URI通常比较长,而且有时候容易出错,且难以理解。所以,在Android当中定义了一些辅助类,并且定义了一些常量来代替这些长字符串的使用,例如下边的代码:
·  Contacts.People.CONTENT_URI (联系人的URI)。
在我们的实例MyProvider中是如下定义的:
public static final String AUTHORITY="com.teleca.PeopleProvider";
public static final String PATH_SINGLE="people/#";
public static final String PATH_MULTIPLE="people";
public static final Uri content_URI=Uri.parse("content://"+AUTHORITY+"/"+PATH_MULTIPLE);

0 0
原创粉丝点击