Android四大组件ContentProvider

一、简介
ContentProvider是四大组件之一,它的功能是数据共享的,ContentProider是将一个进程中的数据与在另一个进程中运行的代码相连接的标准接口。
Android中图库、音频、视频、个人的联系信息等数据的ContentProider。有一些限制,任何Android应用程序都可以访问这些提供程序
ContentProvider是Android系统中提供的专门用户不同应用间进行数据共享的组件,提供了一套标准的接口用来获取以及操作数据,准许开发者把自己的应用数据根据需求开放给其他应用进行增删改查,而无须担心直接开放数据库权限而带来的安全问题。系统预置了许多ContentProvider用于获取用户数据,比如消息、联系人、日程表等。

关于ContentProvider的使用主要介绍以下内容:

Android四大组件ContentProvider

Android四大组件ContentProvider

  
二、权限
作用是数据库得到保护。权限分为:普通权限、危险权限
一个Provider里面可能有私有数据,也有公有数据。也就是说,有可能有些数据可以公开,有些不能公开。并且,有些数据可以让别人修改,有些不能让别人修改。
应用的AndroidManifest.xml文件中,给ContentProvider设置上android:exported属性,
1. android:exported属性设置成true:可被其他应用使用;
2. android:exported属性设置成false:只能被自己所在的应用使用;


在AndroidManifest.xml文件中,对要设置权限的ContentProvider设置上android:permission属性,该属性值可以任意指定一个字符串。通常使用程序的包名作为其中的一部分,这样可以避免和其他应用中的权限声明冲突。
AndroidManifest.xml文件中,与同级的位置,对外声明前面使用的标签,表示这个应用发布了一个叫做com.anddle.provideraccess的权限
 
使用带权限的ContentProvider
假如应用B要使用应用A中带权限的ContentProider,需要在应用B的
AndroidManifest.xml中加入权限的使用
 
其中,<uses-permission/>标签中设置的android:name的值,就是应用A中对外声明的那个provider的权限值。
应用A的ContentProvider还可以将访问的权限进一步细化,分成允许读取和允许写入两种。
当ContentProvider设置了读取的权限,那么其他组件想读取到该ContentProvider的内容时,就必须声明使用读的权限。
当ContentProvider设置了写入的权限,那么其他组件想写入该ContentProvider的内容时,就必须声明使用写的权限。
1. 声明“读取”权限,
 Android四大组件ContentProvider
发布“读取”权利
 Android四大组件ContentProvider
2、声明“写入”权限
 Android四大组件ContentProvider
发布“写入”权限
 Android四大组件ContentProvider
需要注意的是,android:writePermissionandroid:readPermission权限的优先级比android:permission的优先级高,只要设置了高优先级的,那么其他应用要使用高优先级的功能,就要声明高优先级的权限。
例如,一个ContentProvider同时设置了android:readPermissionandroid:permission权限,第三方应用如果只请求了android:permission权限,是没有办法进行读取操作的。


三、ContentProvider存储分析 
URI分为 系统预置 & 自定义,分别对应系统内置的数据(如通讯录、日程表等等)和自定义数据库 
1. 关于 系统预置URI 此处不作过多讲解,需要的同学可自行查看 
2. 此处主要讲解 自定义URI
①、查询记录
contentProvide中使用的查询字符串有别于标准的SQL查询,如select、add、delete、modify等操作我们都使用一种特殊的URI来进行,这种URI由3个部分组成,即“content://”、代表数据的路径和一个可选的标识数据的ID。
以下是一些示例URI:
content://media/internal/images:这个URI将返回设备上存储的所有图片
content://contacts/people/:这个URI将返回设备上的所有联系人信息
content://contacts/people/45:这个URI返回单个结果(联系人信息中ID为45的联系人记录)
尽管这种查询字符串个是很常见,但你是它看起来还是有点令人迷惑。为此,Android提供了一系列的帮助类(在Android,provide包下)里面包含了很多以类变量形式给出的查询字符串,这种方式更容易让用户理解
mediaStore.Imtages.Media.INTERNAL_CONTENT_URI ontacts.People.CONTENT_URI
因此,上面content://contacts/people/45 这个URI就可以写成如下形式:
Uri person = ContentUris.withAppendedId(People.CONTENT_URI,45);
然后执行数据查询:
Cursor cur = managedQuery(person,null,null,null);
  

Android四大组件ContentProvider
②、增加数据
  Android四大组件ContentProvider
③、删除数据
  Android四大组件ContentProvider
④、更新数据
  Android四大组件ContentProvider