Content Providers
什么是ContentProvider
Android四大组件之一,实现各个应用程序之间的(跨应用)数据共享,提供读取和修改数据的统一接口。
什么时候使用ContentProvider
- 允许其它应用访问或修改你的应用数据
- AbstractThreadedSyncAdapter, CursorAdapter, CursorLoader依赖ContentProvider, 因此当你使用这些类时,就需要在你的应用中添加ContentProvider
- 在应用中实现自定义搜索建议,SearchRecentSuggestionsProvider
- 将应用数据公开到widgets
- 将应用的数据或文件复制粘贴到其他应用
ContentResolver
ContentProvider提供了对数据层的封装,要实现增删改查我们可以使用ContentResolver对不同的ConentProvider进行操作。
- Context类中的
getContentResolver()
方法获取ContentResolver对象。 - ContentResolver类中的
insert()
,update()
,delete()
,query()
方法实现增删改查操作
URI
ContetnResolver通过URI区分不同的ContentProvider以及表和表中的数据.
如URI:content://com.example.<appname>.provider/table/333
分为四部分:
content://
: 这部分是固定的,就像http://
代表Http这个协议一样,使用ContentProvider的协议是content://
com.example.<appname>.provider
: Authority,用以区别不同的ContentProvidertable
: 表名,用以区分ContentProvider中不同的数据表333
: id号,用以区别表中的不同数据
定义自己的ContentProvider
- 创建自己的ArticlesProvider继承ContentProvider,并实现
onCreate()
,query(Uri, String[], String, String[], String)
,insert(Uri, ContentValues)
,update(Uri, ContentValues, String, String[])
,delete(Uri, String, String[])
,getType(Uri)
方法. - MIME types
- getType() & getStreamType() - Provider提供文件需要实现getStreamType()方法
- MIME类型由两部分组成,前面是数据的大类别,后面定义具体的种类。ContentProvider中大类别根据同时访问的资源的数量分为两种,对于访问单个资源的URI,它的大类别就为
vnd.android.cursor.item
,而对于同时访问多个资源的URI,它的大类别就为vnd.android.cursor.dir
;具体类别的格式一般为vnd.[company name].[resource type]
vnd.android.cursor.dir/vnd.com.example.provider.table1
- table1表的多行vnd.android.cursor.item/vnd.com.example.provider.table1
- table1表的单行
在AndroidManifest.xml中注册ContentProvider.
1
2
3<provider
android:name="xxx.articles.provider.ArticlesProvider"
android:authorities="xxx.articles.provider" />
数据共享权限 https://developer.android.com/guide/topics/manifest/path-permission-element.html
android:exported
设置此provider是否可以被其他应用使用。android:readPermission
该provider的读权限的标识android:writePermission
该provider的写权限标识android:permission
provider读写权限标识
ContentProvider被其他应用查询
声明Permission:
<permission android:name="me.articles.READ" android:protectionLevel="normal"/>
更改Provider:
1
2
3
4
5
6
7
8<provider
android:name="xxx.articles.provider.ArticlesProvider"
android:authorities="org.weyoung.articles.provider"
android:label="@string/provider_label"
android:multiprocess="false"
android:readPermission="me.articles.READ"
android:exported="true">
</provider>其他应用总添加权限访问该Provider
<uses-permission android:name="me.articles.READ" />