Android学习笔记--内容提供器

本文深入讲解了Android中内容提供器的使用方法,包括如何通过ContentResolver访问其他程序的数据,创建自定义内容提供器的步骤,以及如何利用UriMatcher类进行内容URI的匹配。

1.访问其他程序的数据

内容提供器主要用于在不同应用程序间实现数据共享功能,并能保证数据的安全性。

通过Context中的getContentResolver方法获得ContentResolver实例访问内容提供器中共享的数据,接着就能对数据进行增删改查操作。不同于SQLiteDatabase,ContentResolver对象的增删改查操作使用内容URI参数代替表名参数,内容URI格式主要有两种,如下所示,

协议权限(authority)路径(path)
content://<包名(xxx.xxx.xxx)>.provider/<表名>
协议权限(authority)路径(path)id
content://<包名(xxx.xxx.xxx)>.provider/<表名>/<id>

例如,content://com.example.app.provider/table1指向table1,而content://com.example.app.provider/table1/1指向table1中id为1的数据。此外,还可以使用通配符匹配这两种格式,规则如下表,

*匹配任意长度的任意字符
#匹配任意长度的数字

所以content://com.example.app.provider/*能够匹配任意表,而content://com.example.app.provider/table1/#能匹配table1中的任意一行数据。
接着将内容URI解析为uri对象,例如,

Uri uri=Uri.parse("content://com.example.app.provider/table1");

 使用uri对象就能对数据进行增删改查,例如,

  • 查询数据。
Cursor cursor=getContentResolver().query(uri,projection,selection,selecitonArgs,sortOrder);

参数详细解释如下,

query方法参数对应SQL部分描述
urifrom table_name指定查询某个应用程序下的某一张表
projectionselect column1,column2指定查询的列名
selectionwhere column=value指定where的约束条件
selectionArgs-为where中的占位符提供具体的值
orderByorder by column1,column2指定查询结果的排序方式
  •  添加数据。
ContentValues values=new ContentValues();
values.put("name","cjh");
values.put("gender","male");
getContentResolver().insert(uri,values);
  • 更改数据。
ContentValues values=new ContentValues();
values.put("gender","female");
getContentResolver().update(uri,values,"name=?",new String[]{"cjh"});
  • 删除数据
getContentResolver().delete(uri,"name=?",new String[]{"cjh"});

注:要访问内容提供器的数据,需要在配置文件(AndroidManifest.xml)中声明权限,例如,要获得访问系统联系人的权限,需要加上下列代码,

<uses-permission android:name="android.permission.READ_CONTACTS"/>

2.创建自己的内容提供器

2.1ContentProvider类

通过新建一个类去继承ContentProvider并实现下面六个抽象方法的方式创建自己的内容提供器。

ContentProvider
 

+ onCreate() : boolean

+ query(uri : Uri, projection : String[], selection : String, selectionArgs : String[], sortOrder : String) : Cursor

+ insert(uri : Uri, values : ContentValues) : Uri

+ update(uri : Uri, values : ContentValues, selection : String, selectionArgs : String[]) : int

+ delete(uri : Uri, selection : String, selectionArgs : String[]) : int

+ getType(uri : Uri) : String

  • onCreate方法:当ContentResolver尝试访问程序中的数据时,此时内容提供器会被初始化并调用此方法,通常在此方法内完成数据库的创建和升级等操作。成功返true,失败返false。
  • query方法:uri确定哪张表,projection确定查询哪些列,第三四参数约束查哪些行,sortOrder确定哪种排序方式。
  • insert方法:添加一条数据。返回表示这条新纪录的uri。
  • update方法:返回受影响的行数。
  • delete方法:返回被删除的行数。
  • getType方法:根据传入的uri返回相应的MIME类型。

2.2UriMatcher类

借助UriMatcher类可以实现匹配内容URI的功能,通过addURI方法添加匹配格式,方法接收三个参数,分别是权限路径以及一个自定义代码,例如uriMatcher.addURI("com.example.app.provider","table1",1),当uriMatcher.match(uri)中的uri为com.example.app.provider/table1时方法会返回1,这样就能知道调用方想要访问什么数据。通过switch语句可以控制调用方访问不同数据时执行不同的逻辑,并且可以保护我们不希望被访问的数据。

2.3内容提供器的getType方法

一个内容URI对应的MIME字符串主要由三部分组成,android做了如下格式规定。

第一部分第二部分第三部分
vnd

.android.cursor.dir/

(内容URI以路径结尾)

vnd.<权限>.<路径>
vnd

.android.cursor.item/

(内容URI以id结尾)

vnd.<权限>.<路径>

(注:后面不加id) 

最后,需要将自己实现的内容提供器类在配置文件中注册才能起作用。

<manifest>
    ...
    <application>
        ...
        <provider
            android:name="com.example.app.MyProvider"        <!--内容提供器完整类名-->
            android:authorities="com.example.app.provider"   <!--内容提供器的权限-->
            android:exported="true">           <!--exported属性为true表示可以被其它程序访问-->
        </provider>
    </applicaiton>
</manifest>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值