您的位置:首页 > 编程语言 > PHP开发

ContentProvider小结

2016-05-03 22:40 676 查看

1 简介

主要用于多进程,用来实现跨进程的数据交互。不同于文件存储和 SharedPreferences 存储中的两种全局可读写操作模式,内容提供器可以选择只对哪一部分数据进行共享,从而保证我们程序中的隐私数据不会有泄漏的风险。

内容提供器的用法一般有两种,一种是使用现有的内容提供器来读取和操作相应程序中的数据,另一种是创建自己的内容提供器给我们程序的数据提供外部访问接口。

2 基本用法

1 获取实例

通过Context中的getContentResolver()方法获取到该类的实例。

不同于 SQLiteDatabaseContentResolver 中的增删改查方法都是不接收表名参数的,而是使用一个 Uri 参数代替,这个参数被称为内容 URI。 内容 URI 给内容提供器中的数据建立了唯一标识符,它主要由两部分组成,权限( authority)和路径( path)。权限是用于对不同的应用程序做区分的,一般为了避免冲突,都会采用程序包名的方式来进行命名。

content://com.example.app.provider/table1


而后通过Uri.prase()方法就可以用于后续的数据通信。

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


2 获取Cursor对象

Cursor cursor = getContentResolver().query(
uri,
projection,
selection,
selectionArgs,
sortOrder);


关于上面的形参可参见下表:



3 读取数据

if (cursor != null) {
while (cursor.moveToNext()) {
String column1 = cursor.getString(cursor.getColumnIndex("column1"));
int column2 = cursor.getInt(cursor.getColumnIndex("column2"));
}
cursor.close();
}


4 插入数据

ContentValues values = new ContentValues();
values.put("column1", "text");
values.put("column2", 1);
getContentResolver().insert(uri, values);


5 更新数据

ContentValues values = new ContentValues();
values.put("column1", "");
getContentResolver().update(uri, values, "column1 = ? and column2 = ?", new
String[] {"text", "1"});


6 删除数据

getContentResolver().delete(uri, "column2 = ?", new String[] { "1" });


3 自定义内容提供器

可以实现数据的安全,提供接口就可使用。

1 继承ContentProvider类

实现6个抽象的方法。

OnCreated

初始化内容提供器的时候调用。通常会在这里完成对数据库的创建和升级等操作,

返回 true 表示内容提供器初始化成功,返回 false 则表示失败。注意,只有当存在ContentResolver 尝试访问我们程序中的数据时,内容提供器才会被初始化。

query()

从内容提供器中查询数据。使用 uri 参数来确定查询哪张表, projection 参数用于确定查询哪些列, selectionselectionArgs 参数用于约束查询哪些行, sortOrder 参数用于

对结果进行排序, 查询的结果存放在 Cursor 对象中返回。

insert()

向内容提供器中添加一条数据。使用 uri 参数来确定要添加到的表,待添加的数据

保存在 values 参数中。添加完成后,返回一个用于表示这条新记录的 URI

update()

更新内容提供器中已有的数据。使用 uri 参数来确定更新哪一张表中的数据,新数

据保存在 values 参数中, selectionselectionArgs 参数用于约束更新哪些行, 受影响的

行数将作为返回值返回。

delete()

从内容提供器中删除数据。使用 uri 参数来确定删除哪一张表中的数据, selectionselectionArgs 参数用于约束删除哪些行,被删除的行数将作为返回值返回。

getType()

根据传入的内容 URI 来返回相应的 MIME 类型

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

1. 必须以 vnd 开头。

2. 如果内容 URI 以路径结尾,则后接 android.cursor.dir/,如果内容 URIid 结尾,则后接 android.cursor.item/

3. 最后接上 vnd..

所以,对于 content://com.example.app.provider/table1 这个内容 URI,它所对应的 MIME类型就可以写成:

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


对于 content://com.example.app.provider/table1/1 这个内容 URI,它所对应的 MIME 类型就可以写成:

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


2 访问数据

//这就表示调用方期望访问的是 com.example.app 这个应用的 table1 表中 id 为 1 的数据。
content://com.example.app.provider/table1/1

//*:表示匹配任意长度的任意字符---匹配任意表的内容
content://com.example.app.provider/*

//#:表示匹配任意长度的数字---匹配 table1 表中任意一行数据的内容
content://com.example.app.provider/table1/#


3 UriMatcher匹配URI

UriMatcher中提供了一个 addURI()方法,这个方法接收三个参数,可以分别把权限、路径和一个自定义代码传进去。这样,当调用 UriMatchermatch()方法时,就可以将一个 Uri 对象传入,返回值是某个能够匹配这个 Uri 对象所对应的自定义代码,利用这个代码,我们就可以判断出调用方期望访问的是哪张表中的数据了。

//类似过滤器的作用
public static final int TABLE1_DIR = 0;
public static final int TABLE1_ITEM = 1;
public static final int TABLE2_DIR = 2;

private static UriMatcher uriMatcher;
static {//静态代码块
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI("com.example.app.provider", "table1", TABLE1_DIR);
uriMatcher.addURI("com.example.app.provider ", "table1/#", TABLE1_ITEM);
uriMatcher.addURI("com.example.app.provider ", "table2", TABLE2_ITEM);
uriMatcher.addURI("com.example.app.provider ", "table2/#", TABLE2_ITEM);
}
……
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
switch (uriMatcher.match(uri)) {
case TABLE1_DIR:
// 查询table1表中的所有数据
break;
case TABLE1_ITEM:
// 查询table1表中的单条数据
break;
case TABLE2_DIR:
// 查询table2表中的所有数据
break;
case TABLE2_ITEM:
// 查询table2表中的单条数据
break;
default:
break;
}
……
}


4 声明

Manifest文件中声明:

<provider
android:name="com.example.databasetest.DatabaseProvider"
android:authorities="com.example.databasetest.provider" >
</provider>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: