1、让IT教学更简单,让IT学习更有效Android程序设计教程第八章 ContentProvider数据共享目录 8.1 ContentProvider简介 8.1.1 ContentProvider类 8.1.2 ContentResolver类 8.2 开发ContentProvider程序 8.2.1编写ContentProvider子类 8.2.2 注册ContentProvider 8.2.3 使用ContentProvider 8.3 操作系统的ContentProvider 8.3.1 管理联系人 8.3.2 管理多媒体 8.4 ContentObserver学习目标 了解Cont
2、entProvider类和ContentResolver类 能够开发ContentProvider程序 能够操作系统的ContentProvider 了解ContentObserver类8.1 ContentProvider简介 ContentProvider是Android系统的四大组件之一,是不同应用程序之间进行数据交换的标准API,也是所有应用程序之间数据存储和检索的一个桥梁,其作用是使各个应用程序之间实现数据共享。它以Uri的形式对外提供数据,允许其他应用操作本应用程序的数据,其他应用通过ContentResolver来访问共享的数据。8.1.1 ContentProvider类 Co
3、ntentProvider与Activity、Service、BroadcastReceiver类似,都是Android应用的四大组件之一,需要在AndroidManifest.xml配置文件中进行配置。在ContentProvider类的增、删、改、查操作方法中,都用到类型为Uri的参数,该参数是ContentProvider对外提供的一个自身数据集的唯一标识。当一个ContentProvider管理多个数据集时,该ContentProvider将会为每个数据集分配一个独立且唯一的Uri。Uri的语法格式如下:content:/数据路径/标识ID(可选)其中,“content:/”是Cont
4、entProvider规定的协议,用来标识ContentProvider所管理的scheam,是一个标准的前缀,不能被修改;“数据路径”用于查找所要操作的ContentProvider;“标识ID”是可选的,标识不同数据资源,当访问不同资源时,该ID是动态改变的。Android系统提供了UriMatcher工具类对Uri进行匹配判断,该工具类提供了以下两个常用的方法:void addURI(String authority,String path,int code):用于注册Uri,其中参数authority和path组合成一个Uri,而参数code代表Uri对应的标识符;int match(
5、Uri uri):根据前面注册的Uri判断指定的Uri对应的标识符,如果找不到匹配的标识码,则返回-1.8.1.2 ContentResolver类 ContentProvider类中共享的数据不能被Android应用程序直接访问,而是通过操作ContentResolver类来间接操作ContentProvider中的数据。ContentResolver是内容解析器,提供了对ContentProvider数据进行查询、插入、修改和删除等操作方法。8.2 开发ContentProvider程序 开发ContentProvider程序的步骤如下:(1)创建一个ContentProvider子类,并
6、实现query()、insert()、update()和delete()等方法。(2)在AndroidManifest.xml配置文件中注册ContentProvider,并指定android:authorities属性(一般自动注册)。(3)使用ContentProvider,Activity和Service等组件都可以获取ContentProvider对象,并调用该对象相应的方法进行操作。8.2.1编写ContentProvider子类 新建一个Android项目,在Java源文件夹上右击,选择NewOtherContent Provider选项,弹出如图8.1所示对话框,在Class N
7、ame文本框中输入ContentProvider子类的类名,在URI Authorities文本框中输入数据路径。8.2.2 注册ContentProvider 在AndroidManifest.xml配置文件中注册ContentProvider,只需在元素中添加子元素即可,其示例代码如下。8.2.3 使用ContentProvider(1)首先需要修改相应的XML布局文件(2)修改MainActivity.java文件8.3 操作系统的ContentProvider Android系统本身提供了大量的ContentProvider,例如联系人信息,系统的多媒体信息,系统短信等,程序员自己开发
8、的Android应用程序时,可以通过ContentResolver来调用系统ContentProvider所提供的query()、insert()、update()和delete()方法,如此即可对Android内部数据进行操作。8.3.1 管理联系人 Android系统用于管理联系人的ContentProvider的Uri有以下三种:ContactsContract.Contacts.CONTENT_URI:管理联系人的Uri;ContactsContract.CommonDataKinds.Phone.CONTENT_URI:管理联系人的电话Uri;ContactsContract.Com
9、monDataKinds.Email.CONTENT_URI:管理联系人的E-mail的Uri。8.3.2 管理多媒体Android系统为多媒体提供了相应的ContentProvider的Uri,具体如下所示:MediaStore.Audio.Media.EXTERNAL_CONTENT_URI:存储在外部存储(SD卡)上的音频文件内容的ContentProvider的Uri。MediaStore.Audio.Media.INTERNAL_CONTENT_URI:存储在手机内部存储器上的音频文件内容的ContentProvider的Uri。MediaStore.Images.Media.EXT
10、ERNAL_CONTENT_URI:存储在外部存储器(SD卡)上的图片文件内容的ContentProvider的Uri。MediaStore.Images.Media.INTERNAL_CONTENT_URI:存储在手机内部存储器上的图片文件内容的ContentProvider的uri。MediaStore.Video.Media.EXTERNAL_CONTENT_URI:存储在外部存储器(SD卡)上的视频文件内容的ContentProvider的Uri。MediaStore.Video.Media.INTERNAL_CONTENT_URI:存储在手机内部存储器上的视频文件内容的Content
11、Provider的Uri。8.4 ContentObserver ContentObserver(内容观察者)的目的是观察(捕获)特定Uri引起的数据库变化,继而做出一些相应的处理。它类似于数据库技术中的触发器,当ContentObserver所观察的Uri发生变化时,便会触发ContentObserver的onChange()方法。触发器分为表触发器和行触发器,相应的ContentObserver也分为表ContentObserver和行ContentObserver,当然这是与它所监听的Uri MIME Type有关。ContentObserver的两个常用方法,具体如下所示:ContentObserver(Handler handler):构造方法,所有ContentObserver的派生类都需要调用该构造方法,参数是Handler对象,可以是主线程Handler(这时候可以更新UI),也可以是任何Handler对象。void onChange(boolean selfChange):观察到Uri发生变化时,回调该方法去处理,所有的ContentObserver的派生类都需要调用该方法去处理数据。谢谢