Android系统内容提供者ContentProvider
安卓系统会在每次开机之后扫描所有文件并分类整理存入数据库
,这个数据库保存了手机上存储的所有文件的信息。该数据库文件存放在Android设备的/data/data/com.android.providers.media/databases
或/data/data/com.android.providers.media.module/databases
目录当中,该目录下有两个数据库文件分别是internal.db(内部存储数据库文件)和external.db(外部存储数据库文件), 这两个数据库文件中的数据表和表结构都大体相似,区别在于internal.db是用来存放内部存储中的文件信息的,而external.db是用来存储外部存储中的文件信息的。因此可以通过访问这两个数据库获取例如媒体文件(音频、视频、图片)等的文件信息, 而不必通过遍历媒体文件的方式来获取文件信息。但是在android设备中是禁止应用程序直接对这个数据进行直接操作的,而是将这个数据库的操作通过ContentProvider(内容提供者) 将数据操作提供出来, 如要对ContentProvider中的数据进行操作,可以通过ContentResolver(数据调用者) 对象结合Uri进行调用 来实现 。 ContentResolver(数据调用者)可以实现与ContentProvider进行通信,通过ContentResolver调用ContentProvider的添加(insert)、删除(delete)、查询(query)、修改(update)等操作的同名方法,从而让ContentProvider对象接收数据请求、执行请求的操作并返回结果,这是一套标准的Android内容提供者数据模型。ContentProvider将其存储的数据以数据表的形式提供给访问者,在数据表中每一行为一条记录,每一列为具有特定类型和意义的数据。每一条数据记录都包括一个 “_ID” 数值字段,改字段唯一标识一条数据。每一个Content Provider 都对外提供一个能够唯一标识自己数据集(data set)的公开URI, 如果一个Content Provider管理多个数据集,其将会为每个数据集分配一个独立的URI。所有的Content Provider 的URI 都以”content://” 开头,其中”content:”是用来标识数据是由Content Provider管理的 schema。Android 系统为一些常见的数据类型(如音乐、视频、图像、手机通信录联系人信息等)内置了一系列的 Content Provider,这些都位于android.provider包下。持有特定的许可,可以在自己开发的应用程序中访问这些Content Provider。
为什么要使用ContentProvider(内容提供者)来实现这一功能呢?
ContentResolver如何使用?
ContentResolver实例获得后,就可以进行各种增删改查的方法 ,ContentResolver类也提供了与ContentProvider类相对应的四个方法可供调用:
ContentResolver是通过Uri来查询ContentProvider中提供的数据的。因此想操作ContentProvider,必须要知道内容提供者的Uri,在正确得到Uri之后,就可以通过ContentResolver对象来操作ContentProvider中的数据了。
什么是Uri?
上文中提到了Android提供内容的叫ContentProvider,那么在Android中怎么区分各个Provider?有的是提供联系人的,有的是提供图片的,有的是提供视频的等等。所以就需要有一个唯一的标识来标识这个Provider,Uri(通用资源标识符 Universal Resource Identifier)就是起到了这个标识的作用。每一个ContentProvider都会有一个唯一的Uri地址,通过这个Uri标识可以获取到ContentProvider和其中的数据,然后进行数据操作。
ContentProvider使用的Uri语法结构如下:
对于系统已经提供了如通讯录、多媒体、短信等的URI,可以直接用ContentResolver调用这些URI,对系统数据库进行增删改查等操作,从而保证整个Android设备中数据的统一。