1.ContentProvider简介
在Android中有些数据(如通讯录、音频、视频文件等)是要供很多应用程序使用的,为了更好地对外提供数据,Android系统给我们提供了Content Provider使用,通过它可以访问上面所说的数据,例如很多音乐播放器中的扫描功能其实就用到了Content Provider功能(当然,也有的播放器是自己去实现更底层的功能)。这样的好处是统一管理,比如增加了某个音频文件,底层就会将这种变化通知Content Provider,从而当应用程序访问时就可以获得当前最新的数据。
当然,Android也允许我们定义自己的Content Provider,只要继承它的基类,并且实现下面的方法即可。
public boolean onCreate() 在创建ContentProvider时调用
public Cursor query(Uri, String[], String, String[], String):用于查询指定Uri的ContentProvider,返回一个Cursor
public Uri insert(Uri, ContentValues):根据指定的Uri添加数据到ContentProvider中
public int update(Uri, ContentValues, String, String[]):用于更新指定Uri的ContentProvider中的数据
public int delete(Uri, String, String[]):根据Uri删除指定的数据
public String getType(Uri):用于返回指定的Uri中的数据的MIME类型
*如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头。
例如:要得到所有p1记录的Uri为content://contacts/p1,那么返回的MIME类型字符串为"vnd.android.cursor.dir/p1"。
*如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头。
例如:要得到id为100的student记录的Uri为content://contacts/student/100,那么返回的MIME类型字符串应为"vnd.android.cursor.item/student"。
2.Uri简介
一个标准的Uri为content://authority/path可分为以下三部分:
(1)content://:这个部分是ContentProvider规定的,就像http://代表Http这个协议一样,使用ContentProvider的协议是content://
(2)authorities:它在所在的Android系统必须是唯一的,因为系统就是通过它来决定操作或访问哪个ContentProvider的,这与互联网上的网址必须唯一是一样的道理。
(3)path:资源路径。
显然,从上面的分析可以看出ContentProvider虽然也可实现跨进程通信,但是它适用的场景主要是与数据库相关,有时也可能是文本文件或XML等存储方式。
3.ContentResolver
如果只是定义一个ContentProvider的话,没有任何意义,因为ContentProvider只是内容提供者,它要被别的应用(进程)读取才有价值。与实现ContentProvder的方法相对应,使用ContentResolver相关的方法如下所示: