安卓笔记:ContentProvider

四大组件之一。

ContentProvider是不同应用程序之间进行数据交换的标准API。当一个应用程序暴露自己的数据给其他程序使用时,该应用程序通过提供ContentProvider来实现;其他应用程序通过ContentResolver来操作ContentProvider暴露的数据。

ContentProvider 负责暴露数据,ContentResolver负责操作数据。

1.数据共享标准ContentProvider

简介:

是不同应用程序之间进行数据交换的标准API。ContentProvider以某种Uri的形式对外提供数据,允许其他应用程序访问或修改数据;其他应用程序使用ContentResolver根据Uri去访问操作制定数据。

开发ContentProvider流程:

1.定义自己的ContentProvider类(继承ContentProvider基类)

2.在AndroidManifest.xml中注册ContentProvider,在<application../>元素下添加如下子元素

<provider android:name=".DictProvider"
android:authorities="org.crazyit.providers.dictprovider"
android:exported="true"/>

通过配置文件注册DictProvider(已继承ContentProvider)还需要提供如下几个方法

  • boolean onCreate():该方法在ContentProvider创建后会被调用
  • Uri insert(Uri uri,ContentValues values):根据Uri插入values对应的数据
  • int delete(Uri uri,String selection,String[] selsectionArgs):根据Uri删除selection条件所匹配的所有记录
  • int update(Uri uriContentValues values,String selection,String[] selsectionArgs):根据Uri修改selection条件所匹配的全部记录
  • Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder):根据Uri查询出selection条件所匹配的全部记录,projection是一个列名列表,表明只选择出指定的数据列
  • String getType(Uri uri):返回当前Uri所代表的数据的MIME类型(包括多个记录,MIME类型字符串以vnd.android.cursor.dir/开头;只包含一条记录,MIME类型字符串以vnd.android.cursor.item/开头)

Uri简介:

与URL类似。分为三个部分:

uri例子:content://:org.carzyit.providers.dictprovider/word

  • content://:默认协议
  • org.carzyit.providers.dictprovider:ContentProvider的authorities.
  • word:资源部分(数据部分)

例子:content://:org.carzyit.providers.dictprovider/word/2

此时要访问的是资源为word数据中ID为2的记录

使用ContentResolver操作数据:

Context提供了如下方法获取ContentResolver对象:

  • getContentResolver():获取该应用程序默认的ContentResolver对象
  • insert(Uri uri,ContentValues values):根据Uri对应的ContentProvider中插入values对应的数据
  • delete(Uri uri,String where,String[] selsectionArgs):删除Uri对应的ContentProvider中where条件所匹配的数据
  • update(Uri uriContentValues values,String where,String[] selsectionArgs):更新Uri对应的ContentProvider中where条件所匹配的数据
  • query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder):查询Uri对应的ContentProvider中where条件所匹配的数据

一般来说,ContentProvider是单实例模式:多个应用程序通过ContentResolver来操作ContentProvider提供的数据,ContentProvider调用的数据操作会委托给同一个ContentProvider处理。

2.开发ContentProvider

ContentResolver(A应用)——(间接调用CRUD方法)——》》》ContentProvider(B应用)

ContentResolver(A应用)——(向Uri执行CRUD方法)——》》》  Uri     ——(委托给该Uri对应的ContentResolver)——》》》ContentProvider(B应用)

开发ContentProvider子类:

1.开发一个ContentProvider子类,需要实现query()\insert()\update()\delete()等方法

2.在AndroidManifest.xml文件中注册该ContentProvider,指定android:authorities属性。

配置ContentProvider:

安卓要求所有应用程序组件(Activity、Service、ContentProvider\BroadcastReceiver)都必须显式进行配置。

在<application../>元素添加<provider.../>子元素来配置ContentProvider

属性:

  • name:指定该ContentProvider的实现类的类名
  • authorities:指定该ContentProvider对应的Uri
  • android:exported:指定该ContentProvider是否允许其他程序调用(设为false,该ContentProvider不允许其他应用调用)
  • readPermission:指定读取该ContentProvider所需要的权限
  • writePermission:指定写入该ContentProvider所需要的权限
  • permisson:相当于同时配置readPermission和writePermission两个权限

使用ContentResolver调用方法:

通过getContentResovler()方法获取ContentResovler对象。

创建ContentProvider:

为了确定该ContentProvider实际能处理的Uri,以及确定每个方法中Uri参数所操作的数据,Android系统提供了UriMatcher工具类。

提供了两个方法。

  • void addURI(String authority,String path,int code):该方法用于向UriMatcher对象注册Uri,authority和path组合成一个Uri,code代表该Uri对应的标识码
  • int match(Uri uri):根据前面注册的Uri来判断指定Uri对应的标识码(找不到匹配的标识码,返回-1)

ContentUris工具类(操作Uri字符串的工具类)提供如下两个方法。

  • withAppendedId(uri,id):用于为路径加上ID部分
  • parseId(uri):从指定Uri中解析出所包含的ID值

实例(暂定,后期补充)

3.操作系统的ContentProvider

ContentProvider管理联系人:

实例(暂定,后期补充)

ContentProvider管理多媒体内容:

Uri:后面跟

EXTERNAL_CONTENT_URI:外部存储器

INTERNAL_CONTENT_URI:内部存储器上的

MediaStore.Audio.Media.音频

MediaStore.Images.Media.图片

MediaStore.Video.Media.视频

实例(暂定,后期补充)

4.监听ContentProvider数据改变

ContentObserver简介:

ContentProvider数据发生改变,程序调用如下代码

context.getContentresolver().notifyChange(uri,null);

注册监听器:

registerContentObserver(Uri uri,boolean notifyForDescendents,ContentObserver obserber)

实例:监听用户发出的短信(暂定,后期补充)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值