一、什么是ContentProvider
ContentProvider应用场景:
- 为了应用程序之间交换数据,Android提供了ContentProvider,当一个应用程序需要把自己的数据暴露给其他程序使用时,该应用程序就可以通过提供ContentProvider来实现。
- 比如现在有一个短信接收应用,用户想把接收到的陌生短信的发信人添加到联系人管理应用中,就需要在不同应用之间去共享数据,这时,也可操作它所记录的SharedPreference、文件或者数据库等,这种方式不仅麻烦,而且存在安全漏洞。因此Android 4.2不再推荐使用这种方式,而是推荐使用ContentProvider。
ContentProvider是不同应用程序之间进行数据交换的标准API,它以某种Uri的形式来对外提供数据,允许其他应用访问或者修改数据。而其他应用程序使用ContentResolver来根据Uri去访问或者操作指定的数据。
那么如何完整的开发一个ContentProvider呢:
- 定义自己的ContentProvider类,该类需要继承Android提供的ContentProvider基类。
- 向Android系统注册这个ContentProvider,也就是在AndroidManifest.xml文件中注册这个ContentProvider,就像注册Activity一样,注册ContentProvider时需要为他绑定一个Uri。
<!-- 下面配置中name属性指定ContentProvider类,authorities就相当于为该ContentProvider指定域名-->
<provider
android:authorities="myContentProvider.zt.dictprovider"
android:name=".DictProvider"
android:exported="true"/>
二、ContentProvider
当我们通过上面配置文件注册了DictProvider之后,其他应用程序就可以通过该Uri来访问DictProvider所暴露的数据了(即:插入、删除、更新、查询)。
为了其他程序可以对DictProvider所暴露的数据进行操作,DictProvider还应该提供如下几个方法:
- public boolean onCreate():该方法在ContentProvider创建后会被调用。
- public Uri insert(Uri uri,ContentValues values):根据Uri插入values对应的数据。
- public int delete(Uri uri,String selection,String[] selectionArgs):根据Uri删除selection条件所匹配的全部记录。
- public int update(Uri uri,ContentValues values,String selection,String[] selectionArgs)根据Uri修改selection条件所匹配的全部记录。
public Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs, String sortOrder):根据Uri查询出selection条件所匹配的全部记录,其中projection就是一个列名列表,表明只选择出指定的数据列。
ContentProvider所要求的Uri格式:
如上文我们注册的: content://myContentProvider.zt.dictprovider/words content://+authorities+资源部分(数据部分)//按照访问资源不同,动态改变
例如:
content://myContentProvider.zt.dictprovider/words/2 意味着访问word数据中ID为2的记录。
再有:
content://myContentProvider.zt.dictprovider/words/2/word 意味着访问word数据中ID为2的记录的word字段。
还有:
content://myContentProvider.zt.dictprovider/word/detail/ 意味着访问word节点下的detail节点。
为了将一个字符串转化成Uri,Uri工具类提供了parse()静态方法,如:
Uri uri = Uri.parse(" content://myContentProvider.zt.dictprovider/words/2")
三、ContentResolver
增删查改方法:
query(Uri, String[], String, String[], String)
insert(Uri, ContentValues)
update(Uri, ContentValues, String, String[])
delete(Uri, String, String[])