内容提供器是Android中实现跨程序共享数据的标准方式,内容提供器主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访问数据的安全性
内容提供器的用法有两种:
- 使用现有的内容提供器来读取和操作相应程序中的数据
- 创建自己的内容提供器给我们程序的数据提供外部访问接口
当一个应用程序通过内容提供器对其数据提供了外部访问接口,任何其他的应用程序就都可以对这部分数据进行访问**
对于每一个应用程序来说,如果想要访问内容提供器中共享的数据中,就一定要借助ContentResolver
类,此类可以通过Context
中的getContentResolver()
方法获取到其实例对象,其内部提供了一系列方法进行CRUD操作(和数据库打交道)**
内容提供器中的URI
内容URI
内容URI给内容提供器中的数据建立唯一的标识符,同时也是
ContentResolver
类进行CURD操作的所需参数之一
内容URI由两部分组成:
- 权限<authority>:用于对不同的应用程序进行区分。一般情况下,都会采用程序的包名进行区分
-
路径<path>:用于对同一应用程序中不同的表做区分,添加在去权限的后面。一般情况下,使用表名
再在字符串的头部加上协议声明,故内容URI的标准格式如下:
content://com.example.app.provider/table1
我们可以在内容URI的后面加上一个id:
content://com.example.app.provider/table1/1
表示调用方期望访问的是com.example.app这个应用的table表中id为1的数据。
两种格式的内容URI:
- 以路径结尾就表示期望访问该表中所有的数据
- 以id结尾表示期望访问该表中拥有响应id的数据
可以使用通配符的方式来分别匹配这两种格式的内容URI:
- “*” :表示匹配任意长度的任意字符
- “#”:表示匹配任意长度的数字
例:
- 一个能匹配任意表的内容URI格式就可以写成:
content://com.example.app.provider/*
- 一个能匹配table1表中任意一行数据的内容URI就可以写成:
content://com.example.app.provider/table1/#
得到了内容URI字符串,我们需要将之解析成Uri对象才可以做为参数传入:
Uri uri = Uri.parse("content://com.example.app.provider/table1");
创建自己的内容提供器时使用到的getType()方法
根据传入的内容URI来返回相应的MIME类型,所有的内容提供器都必须提供的一个方法
内容URI对应的MIME字符串主要由三部分组成:
- 必须以
vnd
开头 - 如果内容URI以路径结尾,则后接
android.cursor.dir/
,如果内容以id结尾,则后接android.cursor.item/
- 最后接上
vnd.<authority>.<path>
例:
对于content://com.example.app.provider/table1
内容URI,对应的MIME类型就可以写成:
vnd.android.cursor.dir/vnd.com.example.provider.table1
对于content://com.example.app.provider/table1/1
内容URI,对应的MIME类型就可以写成:
vnd.android.cursor.item/vnd.com.example.provider.table1