【Android学习笔记】用于共享数据的Content Provider

一、What is a content provider?

Content provider管理android以结构化方式存放的数据。他以相对安全的方式封装数据并且提供简易的处理机制。Content provider提供不同进程间数据交互的标准化接口。

当你准备取出content provider中的数据时,你需要获得一个和当前context相关的ContentResolver对象作为客户端。这个对象和一个继承至ContentProviderprovider对象相关联。provider从客户端接收请求并且返回结果.

如果你不准备和其他应用共享你的数据,你不需要自定义provider。但是,你需要实现provider以满足个性化搜索数据的需求。同时,当你拷贝和粘贴复杂数据或者文件到他人应用中时,也需要provider

注意:content provider可以访问各种类型的数据(文件、sharedpreference、xml、sqlite),它都会把它认为是一张表,然后通过uri进行访问。当然我们最常访问的往往是sqlite数据库。


二、How to create and use it?

1.继承ContentProvider

2.重写生命周期方法onCreate、query、insert、update、delete、getType,从方法的名字基本可以看出,主要的操作特别像SQLite数据库的操作。

3.manifest文件进行配置主要是name和authorities(对应uri的authority)

三、 Android Storage Access Framework

Android Storage Access Framework(SAF), 是Android 4.4版本(API 19)开始引入的,它可以很方便的让用户浏览、打开设备上的文件以及浏览最近使用过的文件列表。而且SAF不仅可以让用户查看本 地存储的文件, 也可以使用户查看网络上的文件,同时它还可以查看临时存储设备上的文件:一旦成功插入一个USB储存设备,我们就可以浏览它上面的文件。因此SAF可以很方便的让我们的应用实现文件浏览以及进行常见文件操作。

具体可以参考链接1 链接2 链接3
四、Others

1.URI

内容 URI 给内容提供器中的数据建立了唯一标识符,它主要由两部分组成,权限(authority)和路径(path) 。权限是用于对不同的应用程序做区分的,一般为了避免冲突,都会采用程序包名的方式来进行命名。比如某个程序的包名是 com.example.app,那么该程序对应的权限就可以命名为 com.example.app.provider。路径则是用于对同一应用程序中不同的表做区分的,通常都会添加到权限的后面。比如某个程序的数据库里存在两张表,table1 和 table2,这时就可以将路径分别命名为/table1和/table2,然后把权限和路径进行组合,内容 URI 就变成了 com.example.app.provider/table1和 com.example.app.provider/table2。不过,目前还很难辨认出这两个字符串就是两个内容URI,我们还需要在字符串的头部加上协议声明。因此,内容 URI 最标准的格式写法如下:
content://com.example.app.provider/table1
除此之外,我们还可以在这个内容 URI 的后面加上一个 id,如下所示:
content://com.example.app.provider/table1/1
这就表示调用方期望访问的是 com.example.app 这个应用的 table1 表中 id 为 1 的数据。内容 URI 的格式主要就只有以上两种,以路径结尾就表示期望访问该表中所有的数据,以 id 结尾就表示期望访问该表中拥有相应 id 的数据。我们可以使用通配符的方式来分别匹配这两种格式的内容 URI,规则如下。
1. *:表示匹配任意长度的任意字符
2. #:表示匹配任意长度的数字
所以,一个能够匹配任意表的内容 URI 格式就可以写成:
content://com.example.app.provider/*
而一个能够匹配 table1 表中任意一行数据的内容 URI 格式就可以写成:
content://com.example.app.provider/table1/#
系统常用的content uri 见点击打开链接

2.UriMacther

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

3.MIME

一个内容 URI 所对应的 MIME字符串主要由三部分组分,Android 对这三个部分做了如下格式规定。
1. 必须以 vnd 开头。
2. 如果内容 URI 以路径结尾,则后接 android.cursor.dir/,如果内容 URI 以 id 结尾,则后接 android.cursor.item/。
3. 最后接上 vnd.<authority>.<path>。
所以,对于 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
具体参看MIME

五、References

http://xiechengfa.iteye.com/blog/1415829
http://www.cnblogs.com/renyuan/archive/2012/08/28/2660297.html
http://blog.csdn.net/kaiwii/article/details/7780593
http://blog.csdn.net/h3g2010/article/details/6093366
http://codingnow.cn/android/1078.html
《官方文档》
《第一行代码-Android》

你可能感兴趣的:(android,Provider,content)