contentProvider和contentResolver

1.什么是ContentProvider

ContentProvider翻译为“内容提供者”;

定义:指该应用包含一些方法,供外界访问,其他应用程序可以调用该方法,比如如果应用A创建了一个数据库“test.db”,默认是私有的,即其他应用程序不能对其进行操作,但是如果应用A使用了ContentProvider,则其他应用程序可以访问该数据库;

补充:ContentUris辅助类

 

URI uri = ContentUris.withAppendId(URI param,int id);  //为某个URI添加一个ID

比如param = "content://authorities/person",id=10,则uri = "content://authorities/person/10";

long id = ContentUris.parseId(URI uri); //提取URI中最后的ID

比如uri = "content://authorities/person/10",则返回的id=10;


 数据库在 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
外界的程序通过 ContentResolve r接口可以访问 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);


4.

 // 内容类型
        public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.amaker.employees";
        public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.amaker.employees";
vnd.android.cursor是IMEI类型 有两种 type/subtype。
假设一个provider含有列车时刻表,provider的authority是com.example.trains,并且它包含三个表:线路1,线路2,线路3。在URI的响应中,
content://com.example.trains/Line1。指向线路1表,provider返回对应的MIME类型为:
vnd.android.cursor.dir/vnd.example.line1

而content URI:content://com.example.trains/Line2/5。指向线路2表的第5行,provider返回的对应的MIME类型为:vnd.android.cursor.item/vnd.example.line2

表的 MIME 类型

getType() 方法会返回一个 MIME 格式的 String,后者描述内容 URI 参数返回的数据类型。Uri 参数可以是模式,而不是特定 URI;在这种情况下,您应该返回与匹配该模式的内容 URI 关联的数据类型。

对于文本、HTML 或 JPEG 等常见数据类型, getType() 应该为该数据返回标准 MIME 类型。 IANA MIME Media Types 网站上提供了这些标准类型的完整列表。

对于指向一个或多个表数据行的内容 URI, getType() 应该以 Android 供应商特有 MIME 格式返回 MIME 类型:

  • 类型部分:vnd
  • 子类型部分:
    • 如果 URI 模式用于单个行:android.cursor.item/
    • 如果 URI 模式用于多个行:android.cursor.dir/
  • 提供程序特有部分:vnd.<name>.<type>

    您提供 <name> 和 <type>。 <name> 值应具有全局唯一性, <type> 值应在对应的 URI 模式中具有唯一性。适合选择贵公司的名称或您的应用 Android 软件包名称的某个部分作为 <name>。 适合选择 URI 关联表的标识字符串作为 <type>

例如,如果提供程序的权限是 com.example.app.provider,并且它公开了一个名为 table1 的表,则 table1 中多个行的 MIME 类型是:

vnd.android.cursor.dir/vnd.com.example.provider.table1

对于 table1 的单个行,MIME 类型是:

vnd.android.cursor.item/vnd.com.example.provider.table1


contentProvider使用方法

1.定义一个实体类

包含 CONTENT_URI、CONTENT_TYPE、CONTENT_ITEM_TYPE 以及需要定义的字段

2.创建实体contentProvider extends ContentProvider 

重写contentprovider的 增删改查方法 。

定义UriMatcher。

定义DBHelper extends  SQLiteOpenHelper 创建数据库以及表

3.调用的地方 getContentResolver().增删改查

contentProvider实例化方法 getContentResolver得到ContentResolver实例, contentResolver实例调用的是contentProvider中实例化的方法。

由于android中创建的数据库都是私有的通过contentprovider 将接口暴露出去,通过CONTENT_URI 来定义每一个创建的数据库或者文件存储方式。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值