ContentProvider小结
2016-05-03 22:40
676 查看
1 简介
主要用于多进程,用来实现跨进程的数据交互。不同于文件存储和 SharedPreferences 存储中的两种全局可读写操作模式,内容提供器可以选择只对哪一部分数据进行共享,从而保证我们程序中的隐私数据不会有泄漏的风险。内容提供器的用法一般有两种,一种是使用现有的内容提供器来读取和操作相应程序中的数据,另一种是创建自己的内容提供器给我们程序的数据提供外部访问接口。
2 基本用法
1 获取实例
通过Context中的getContentResolver()方法获取到该类的实例。不同于 SQLiteDatabase, ContentResolver 中的增删改查方法都是不接收表名参数的,而是使用一个 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 参数用于确定查询哪些列, selection 和 selectionArgs 参数用于约束查询哪些行, sortOrder 参数用于
对结果进行排序, 查询的结果存放在 Cursor 对象中返回。
insert()
向内容提供器中添加一条数据。使用 uri 参数来确定要添加到的表,待添加的数据
保存在 values 参数中。添加完成后,返回一个用于表示这条新记录的 URI。
update()
更新内容提供器中已有的数据。使用 uri 参数来确定更新哪一张表中的数据,新数
据保存在 values 参数中, selection 和 selectionArgs 参数用于约束更新哪些行, 受影响的
行数将作为返回值返回。
delete()
从内容提供器中删除数据。使用 uri 参数来确定删除哪一张表中的数据, selection和 selectionArgs 参数用于约束删除哪些行,被删除的行数将作为返回值返回。
getType()
根据传入的内容 URI 来返回相应的 MIME 类型
一个内容 URI 所对应的 MIME字符串主要由三部分组分, Android 对这三个部分做了如下格式规定。
1. 必须以 vnd 开头。
2. 如果内容 URI 以路径结尾,则后接 android.cursor.dir/,如果内容 URI 以 id 结尾,则后接 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()方法,这个方法接收三个参数,可以分别把权限、路径和一个自定义代码传进去。这样,当调用 UriMatcher 的 match()方法时,就可以将一个 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>
相关文章推荐
- Postfix服务器与PHP的结合
- 时间戳 解决浏览器缓存问题
- phpMyAdmin 缺少 mcrypt 扩展.请检查 PHP 配置.
- PHP setcookie() 函数
- php htmlentities和htmlspecialchars 的区别
- htmlspecialchars.php
- phpmyadmin 出现Table 'root.pma_table_uiprefs' doesn't exist
- php字符串操作
- PHP使用COM 获取RTF内容
- ThinkPHP中的create方法与自动令牌验证
- php制作验证码
- 1.PHP连接mysql中文乱码问题
- PHP 随机数 C扩展随机数
- 5分钟提高Laravel框架性能10倍以上
- 向API 接口发送和接收json数据(php,js)
- Adding DTrace Probes to PHP Extensions
- PHP--date()
- thinkPHP中怎么使用阿里云的sdk
- 编译php-5.5.15出错,xml2-config not found
- 安装PHP时显示,xml2-config not found怎么办