ContentProvider简介
内容提供者,是 Android 四大组件之一,是不同应用程序之间进行数据交换的标准API,ContentProvide以Uri的形式对外提供数据,允许其他应用访问和修改数据;其他应用使用ContentResolve根据Uri进行访问操作指定的数据。
使用ContentProvider共享数据的好处是统一了数据访问方式。Android内置的许多数据都是使用ContentProvider形式,如视频,音频,图片,通讯录等。
使用ContentProvider我们经常会用到三个类:ContentProvider、Uri、ContentResolver。
作用示意图
进程间 进行数据交互 & 共享,即跨进程通信。数据源可以是数据库、文件、XML、网络等。

?具体使用
关于ContentProvider的使用主要介绍以下内容:
?
?使用详解-URI
- 定义:Uniform Resource Identifier,即统一资源标识符。
- 作用:唯一标识 ContentProvider 和其中的数据。外界进程通过 URI 找到对应的ContentProvider & 其中的数据,再进行数据操作
- 使用:URI分为系统预置和自定义,分别对应系统内置的数据(如通讯录、日程表等等)和自定义数据库,下面描述自定义Uri。 例如content://com.example.provider.myprovider/test,与网络的Uri类似,其规则如下: content://:协议部分,表示ContentProvider使用的协议,Android规定的固定值。 com.example.provider.myprovider:URI 的标识,通过属性authorities定义,系统通过这个标识找到要对应的ContentProvider;为了保证URI标识的唯一性,它一般是一个完整的、小写的类名。 test:资源所在的路径,访问者可以动态访问不同的资源;如果想要访问具体数据,可以在后面加上该行的ID,例如上述路径下的第1条记录,那么Uri可以写为content://com.example.provider.myprovider/test/1。

?
- *:匹配任意长度的任何有效字符的字符串 以下的URI 表示 匹配provider的任何内容content://com.example.provider.myprovider/test/*
- #:匹配任意长度的数字字符的字符串 以下的URI 表示 匹配provider中的table表的所有行content://com.example.provider.myprovider/test/#?
- 若想给ContentProvider添加端口,在注册ContentProvide、访问ContentProvide时也要添加上该端口号其规则如下:
content://com.example.provider.myprovider:200/test
\---------/ \--------------------------------------------------/ \---/
scheme? ? ? ? ? ? ? ? ? ? ? ? ?authority? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?path
使用详解-MIME
- 简介:全称Multipurpose Internet Mail Extensions,多功能Internet 邮件扩充服务。用来指定某个扩展名的文件用某种应用程序来打开,如指定.html文件采用text应用程序打开。 每种MIME类型由2部分组成:类型 + 子类型:
- 形式1:单条记录 ?
? ? ? ? ? ?vnd.android.cursor.item/自定义
? ? ? ? ? vnd.android.cursor.dir/自定义
? ? ?1. vnd:表示父类型和子类型具有非标准的、特定的形式。
? ? ? 2. 父类型已固定好(即不能更改),只能区别是单条还是多条记录
? ? ? 3. 子类型可自定义
使用详解-MIME实例说明
- String getType(Uri) 用于返回指定的Uri中的数据的MIME类型。
- 如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头。 ? 例如:要得到所有person记录的Uri为content://contacts/person, ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? 那么返回的MIME类型字符串为"vnd.android.cursor.dir/person"。
- 如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头。 ? ? ?
? ? ? ? ? 例如:要得到id为10的person记录的Uri为content://contacts/person/10, ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ?那么返回的MIME类型字符串应为"vnd.android.cursor.item/person"
使用详解-ContentProvider类
- 介绍:ContentProvider主要以表格的形式组织数据,同时也支持文件数据。 每个表格中包含多张表,每张表包含行和列,分别对应记录和字段。 ContentProvider类并不会直接与外部进程交互,而是通过ContentResolver 类与外部交互。
- ContentProvider主要方法介绍如下表所示:

使用详解-ContentResolver类
介绍:
- ContentResolver通过URI即可操作 不同的ContentProvider 中的数据,统一管理不同 ContentProvider间的操作。
- 外部进程通过 ContentResolver类从而与ContentProvider类进行交互。
- 通过调用Content的 getContentResolver() 方法获取 ContentResolver对象实例, 其实ContentResolver的作用类似于HttpClient,获取对象后就可以根据Uri对应用的数 据进行CRUD操作了。
- ContentResolver 类提供了与ContentProvider类相同名字与作用的4个方法。
为什么要使用通过ContentResolver类从而与ContentProvider类进行交互,而不直接访问ContentProvider类?
一款应用要使用多个ContentProvider,若需要了解每个ContentProvider的不同实现从而再完成数据交互,操作成本高 & 难度大, 所以再ContentProvider类上加多了一个 ContentResolver类对所有的ContentProvider进行统一管理。
ContentResolver、ContentProvider、URI关系图

?使用详解-辅助类

?
|