概念
ContentProvider是Android应用对外开放的数据接口,只要符合它所定义的Uri格式的请求,均可以正常访问执行操作。其他的Android应用可以使用ContentResolver对象通过与ContentProvider同名的方法请求执行,被执行的就是ContentProvider中的同名的方法。所以ContentProvider很多对外可以访问的方法,在ContentResolver中均有同名的方法,是一一对应的。
基本使用
ContentProvider是内容提供者,实现Android应用之间的数据交互,对于数据操作,无非也就是CRUD而已。下面是ContentProvider必须要实现的几个方法:
- onCreate():初始化提供者。
- query(Uri, String[], String, String[], String):查询数据,返回一个数据Cursor对象。
- insert(Uri, ContentValues):插入一条数据。
- update(Uri, ContentValues, String, String[]):根据条件更新数据。
- delete(Uri, String, String[]):根据条件删除数据。
- getType(Uri) 返回MIME类型对应内容的URI。、
除了onCreate()和getType()方法外,其他的均为CRUD操作,这些方法中,Uri参数为与ContentProvider匹配的请求Uri,剩下的参数可以参见SQLite的CRUD操作,基本一致。
还有两个方法:call()和bulkInsert()方法,使用call,理论上可以在ContentResolver中执行ContentProvider暴露出来的任何方法,而bulkInsert()方法用于插入多条数据。
在ContentProvider的CRUD操作,均会传递一个Uri对象,通过这个对象来匹配对应的请求,那么如何确定一个Uri执行哪项操作呢?需要用到一个UriMatcher对象,这个对象用来帮助内容提供者匹配Uri,它所提供的方法非常简单,仅有两个:
void addURI(String authoity,String path,int code):添加一个Uri匹配项,authtity为AndroidManifest.xml中注册的ContentProvider的authority属性;path为一个路径,可以设置通配符,#表示任意数字,*表示任意字符;code为自定义的一个Uri代码
int match(Uri uri):匹配传递的Uri,返回addUri()传递的Code参数。
在创建好一个ContentProvider之后,还需要在AndroidManifest.xml文件中对ContentProvider进行配置,使用一个
创建及调用自己的ContentProvider
授权:
在Android中,每一个ContentProvider都会用类似于域名的字符串来注册自己,我们成为授权(authority)。这个唯一标识的字符串是此ContentProvider可提供的一组URI的基础,有了这个基础,才能够向外界提供信息的共享服务。
授权是在AndroidManifest.xml中完成的,每一个ContentProvider必须在此声明并授权,方式如下:
Android附带的ContentProvider
- Browser:存储如浏览器的信息。
- CallLog:存储通话记录等信息。
- Contacts:存储联系人等信息。
- MediaStore:存储媒体文件的信息。
- Settings:存储设备的设置和首选项信息。