ContentProvider

合集下载

Content_Provider使用

Content_Provider使用

Android应用程序可以使用文件或SqlLite数据库来存储数据。

Content Provider提供了一种多应用间数据共享的方式,比如:联系人信息可以被多个应用程序访问。

Content Provider 是个实现了一组用于提供其他应用程序存取数据的标准方法的类。

应用程序可以在Content Provider中执行如下操作:查询数据修改数据添加数据删除数据标准的Content Provider:Android提供了一些已经在系统中实现的标准Content Provider,比如联系人信息,图片库等等,你可以用这些Content Provider来访问设备上存储的联系人信息,图片等等。

查询记录:在Co 于标准的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.provider包下),里面包含了很多以类变量形式给出的查询字符串,这种方式更容易让我们理解一点,参见下例:MediaStore.Images.Media.INTERNAL_CONTENT_URIContacts.People.CONTENT_URI因此,如上面content://contacts/people/45这个URI就可以写成如下形式:Uri person = ContentUris.withAppendedId(People.CONTENT_URI, 45);然后执行数据查询:Cursor cur = managedQuery(person, null, null, null);这个查询返回一个包含所有数据字段的游标,我们可以通过迭代这个游标来获取所有的数据:package com.wissen.testApp;public class ContentProviderDemo extends Activity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);displayRecords();}private void displayRecords() {//该数组中包含了所有要返回的字段String columns[] = new String[] { , People.NUMBER };Uri mContacts = People.CONTENT_URI;Cursor cur = managedQuery(mContacts,columns, // 要返回的数据字段null, // WHERE子句null, // WHERE 子句的参数null // Order-by子句);if (cur.moveToFirst()) {String name = null;String phoneNo = null;do {// 获取字段的值name = cur.getString(cur.getColumnIndex());phoneNo = cur.getString(cur.getColumnIndex(People.NUMBER));Toast.makeText(this, name + ””+ phoneNo, Toast.LENGTH_LONG).show();} while (cur.moveToNext());}}}上例示范了一个如何依次读取联系人信息表中的指定数据列name和number。

contentResolver用法

contentResolver用法

contentResolver⽤法如果想公开⾃⼰的数据,那么可有两种办法:1.创建⾃⼰的ContentProvider,需要继承ContentProvider类2.如果你的数据和已存在的ContentProvider数据结构⼀致,可以将数据写到已存在的ContentProvider中当然前提是获取写该ContentProvider的权限.⽐如把OA中的成员通讯信息加⼊到系统的联系⼈ContentProvider中ContentProvider基础所有ContentProvider都需要实现相同的接⼝,⽤于查询ContentProvider并返回数据.也包括增加、修改和删除数据.步骤:1.获得⼀个ContentResolver的实例,可通过Activity的成员⽅法getContentResovler()⽅法:ContentResolver cr = this.getContentResolver();ContentResolver实例带的⽅法可实现找到指定的ContentProvider并获取到ContentProvider的数据ContentResolver的查询过程开始,Android系统将确定查询所需的具体ContentProvider,确认它是否启动并运⾏它.android系统负责初始化所有的ContentProvider,不需要⽤户⾃⼰去创建.实际上,ContentProvider的⽤户都不可能直接访问到ContentProvider 实例,只能通过ContentResolver在中间代理.2.数据模型ContentProvider展⽰数据类似⼀个单个数据库表.其中:每⾏有个带唯⼀值的数字字段,名为_ID,可⽤于对表中指定记录的定位.ContentProvider返回的数据结构,是类似JDBC的ResultSet,在android中,是Cursor对象.URI,每个ContentProvider定义⼀个唯⼀的公开的URI,⽤于指定到它的数据集.⼀个ContentProvider可以包含多个数据集(可以看作多张表),这样,就需要有多个URI与每个数据集对应.这些URI要以这样的格式开头:content://表⽰这个URI指定⼀个ContentProvider.如果你想创建⾃⼰的ContentProvider,最好把⾃定义的URI设置为类的常量,这样简化别⼈的调⽤,并且以后如果更新URI也很容易.android定义了CONTENT_URI常量⽤于URI,如:android.provider.Contacts.Phones.CONTENT_URI2.查询ContentProvider要想使⽤⼀个ContentProvider,需要以下信息:定义这个ContentProvider的URI,返回结果的字段名称,这些字段的数据类型如果需要查询ContentProvider数据集的特定记录(⾏),还需要知道该记录的ID的值.构建查询查询就是输⼊URI等参数,其中URI是必须的,其他是可选的,如果系统能找到URI对应的ContentProvider将返回⼀个Cursor对象.可以通过ContentResolver.query()或者Activity.managedQuery()⽅法.两者的⽅法参数完全⼀样,查询过程和返回值也是相同的.区别是,通过Activity.managedQuery()⽅法,不但获取到Cursor对象,⽽且能够管理Cursor对象的⽣命周期.⽐如当Activity暂停(pause)的时候,卸载该Cursor对象,当Activity Restart的时候重新查询.另外,也可以对⼀个没有处于Activity管理的Cursor对象做成被Activity管理的,通过调⽤Activity.startManaginCursor()⽅法.类似这样:Cursor cur = managedQuery(myPerson,null,null,null,null);其中第⼀个参数myPerson是Uri类型实例.如果需要查询的是指定⾏的记录,需要⽤_ID值,⽐如ID值为23,URI将是类似:content://....../23android提供了⽅便的⽅法,让开发者不需要⾃⼰拼接上⾯这样的URI,⽐如类似:Uri myPerson = ContentUris.withAppendedId(People.CONTENT_URI,23);或者:Uri myPerson = Uri.withAppendedPath(People.CONTENT_URI,"23");⼆者的区别是⼀个接收整数类型的ID值,⼀个接收字符串类型.其他⼏个参数:names,可以为null,表⽰取数据集的全部列,或者声明⼀个String数组,数组中存放列名称,⽐如:People._ID.⼀般列名都在该ContentProvider中有常量对应;针对返回结果的过滤器,格式类似于SQL中的WHERE⼦句,区别是不带WHERE关键字,如果返回null表⽰不过滤,⽐如name=?;前⾯过滤器的参数,是String数组,是针对前⾯条件中?占位符的值;排序参数,类似SQL的ORDER BY字句,不过不需要写ORDER BY部分,⽐如name desc,如果不排序,可输⼊null.返回值是Cursor对象,游标位置在第⼀条记录之前.下⾯实例适⽤于android 2.0及以上版本,从android通讯录中得到姓名字段:java代码:Cursor cursor = getContentResolver().query(monDataKinds.Phone.CONTENT_URI,null,null,null,null);读取返回的数据如果在查询的时候使⽤到ID,那么返回的数据只有⼀条记录.在其他情况下,⼀般会有多条记录.和JDBC的ResultSet类似,需要操作游标遍历结果集,在每⾏,再通过列名获取到列的值,可以通过getString()、getInt()、getFloat()等⽅法获取值.⽐如类似下⾯:java代码:while(cursor.moveToNext()) {builder.append(cursor.getString(cursor.getColumnIndex(monDataKinds.Phone.DISPLAY_NAME))).append("-"); }和JDBC中不同,没有直接通过列名获取列值的⽅法,只能先列名获取到列的整型索引值,然后再通过该索引值定位获取列的值.编辑数据可以通过ContentProvider实现以下编辑功能:增加新的记录:在已经存在的记录中增加新的值、批量更新已经存在的多个记录、删除记录.所有的编辑功能都是通过ContentResolver的⽅法实现.⼀些ContentProvider对权限要求更严格⼀些,需要写的权限,如果没有会报错.增加记录要想增加记录到ContentProvider,⾸先,要在ContentValues对象中设置类似map的键值对,在这⾥,键的值对应ContentProvider中的列的名字,键值对的值,是对应列希望的类型.然后,调⽤ContentResolver.insert()⽅法,传⼊这个ContentValues对象,和对应ContentProvider的URI即可.返回值是这个新记录的URI对象.这样你可以通过这个URI获得包含这条记录的Cursor对象.⽐如:java代码:ContentValues values = new ContentValues();values.put(,"Abraham Lincoln");Uri uri = getContentResolver().insert(People.CONTENT_URI, values);在原有记录上增加值如果记录已经存在,可在记录上增加新的值,或者编辑已经存在的值.⾸先要找到原来的值对象,然后要清除原有的值,然后像上⾯增加记录⼀样即可:java代码:Uri uri = Uri.withAppendedPath(People.CONTENT_URI, "23");Uri phoneUri = Uri.withAppendedPath(uri, People.Phones.CONTENT_DIRECTORY);values.clear();values.put(People.Phones.TYPE, People.Phones.TYPE_MOBILE);values.put(People.Phones.NUMBER, "1233214567");getContentResolver().insert(phoneUri, values);批量更新值批量更新⼀组记录的值,⽐如NY改名为Eew York.可调⽤ContentResolver.update()⽅法.删除记录如果是删除单个记录,调⽤ContentResolver.delete()⽅法,URI参数,指定到具体⾏即可.如果是删除多个记录,调⽤ContentResolver.delete()⽅法,URI参数指定Contentprovider即可,并带⼀个类似SQL的WHERE⼦句条件.这⾥和上⾯类似,不带WHERE关键字.创建⾃⼰的ContentProvider创建contentprovider,需要设置存储系统.⼤多数ContentProvider使⽤⽂件或者SQLite数据库,不过你可以⽤任何⽅式存储数据.android提供SQLiteOpenHelper帮助开发者创建和管理SQLiteDatabase.继承ContentProvider,提供对数据的访问.在manifest⽂件中声明ContentProvider.继承ContentProvider类必须定义ContentProvider类的⼦类,需要实现如下⽅法:java代码:query()insert()update()delete()getType()onCreate()在实现⼦类的时候,还有⼀些步骤可以简化ContentProvider客户端的使⽤:定义public static final Uri常量,名称为CONTENT_URI:java代码:public static final Uri CONTENT_URI = Uri.parse("content://com.example.codelab.transportationprovider");如果有多个表,它们也是使⽤相同的CONTENT_URI,只是它们的路径部分不同.声明ContentProvider创建ContentProvider后,需要在manifest⽂件中声明,android系统才能知道它,当其他应⽤需要调⽤该ContentProvider时才能创建或者调⽤它.语法类似:<provider android:name="com.easymorse.cp.MyContentProvider"android:authorities="com.easymorse.cp.mycp"></provider>android:name要写ContentProvider继承类的全名.android:authorities要写和CONTENT_URI常量的B部分。

第六章 内容提供者

第六章 内容提供者

形式对外提供数据,允许其他应用操作本应用数据。其他应用则使用
ContentResolver,并根据ContentProvider提供的Uri操作指定数据。
通过 ContentResolver 操作A应用数据 操作暴露的数据 ContentResolver 返回操作结果 返回操作结果
A应用 使用 ContentProvider 暴露的数据
6.5 本章小结
本章详细地讲解了内容提供者的相关知识,首先简
单介绍了内容提供者,然后讲解了如何创建内容提 供者以及访问其他程序暴露的数据。最后讲解内容 观察者,通过内容观察者观察数据的变化。
用的ContentProvider 中调用ContentResolver 的notifyChange() 方法。调用 – 内容观察者( ContentObserver )是用来观察指定 Uri所代表的数据。 了这个方法之后当数据发生变化时,它就会向“消息中心”发送数据变化 当ContentObserver 观察到指定Uri代表的数据发生变化时,就会触发 的消息。然后C应用观察到“消息中心”有数据变化时,就会触发 ContentObserver 的onChange()方法。此时在onChange()方法里使用 ContentObserver的onChange()方法。
是继承于 ContentProvider类的 全路径名称
<provider
android:name="cn.itcast.db.PersonDBProvider"

android:authorities="cn.itcast.db.personprovider" > </provider>
表示访问本provider的 路径,注意这里的路 径必须要唯一。

Android之四大组件、六大布局、五大存储总结

Android之四大组件、六大布局、五大存储总结

Android之四⼤组件、六⼤布局、五⼤存储总结Android之四⼤组件、六⼤布局、五⼤存储⼀.四⼤组件:四⼤组件分别为activity、service、content provider、broadcast receiver。

⼀、android四⼤组件详解1、activity(1)⼀个Activity通常就是⼀个单独的屏幕(窗⼝)。

(2)Activity之间通过Intent进⾏通信。

(3)android应⽤中每⼀个Activity都必须要在AndroidManifest.xml配置⽂件中声明,否则系统将不识别也不执⾏该Activity。

2、service(1)service⽤于在后台完成⽤户指定的操作。

service分为两种:(a)started(启动):当应⽤程序组件(如activity)调⽤startService()⽅法启动服务时,服务处于started状态。

(b)bound(绑定):当应⽤程序组件调⽤bindService()⽅法绑定到服务时,服务处于bound状态。

(2)startService()与bindService()区别:(a)started service(启动服务)是由其他组件调⽤startService()⽅法启动的,这导致服务的onStartCommand()⽅法被调⽤。

当服务是started 状态时,其⽣命周期与启动它的组件⽆关,并且可以在后台⽆限期运⾏,即使启动服务的组件已经被销毁。

因此,服务需要在完成任务后调⽤stopSelf()⽅法停⽌,或者由其他组件调⽤stopService()⽅法停⽌。

(b)使⽤bindService()⽅法启⽤服务,调⽤者与服务绑定在了⼀起,调⽤者⼀旦退出,服务也就终⽌,⼤有“不求同时⽣,必须同时死”的特点。

(3)开发⼈员需要在应⽤程序配置⽂件中声明全部的service,使⽤<service></service>标签。

android获取绝对路径的方法

android获取绝对路径的方法

android获取绝对路径的方法在Android中,由于安全和隐私的考虑,应用程序通常无法直接访问文件系统的绝对路径。

这是为了防止应用程序随意读写设备上的文件,从而保护用户的隐私和数据安全。

但是,您可以通过使用Android的存储API来访问文件。

以下是一些常见的方法:1. 使用ContentProvider:如果您想访问其他应用程序的文件,可以使用ContentProvider。

例如,使用`MediaStore` API可以访问媒体文件。

2. 使用外部存储:对于外部存储,您可以使用`getExternalFilesDir()`方法获取特定于应用的目录。

这将在外部存储的一个特定目录下为应用创建一个目录。

3. 使用内部存储:使用`getFilesDir()`方法可以获取到应用的内部存储目录。

这是一个私有的、安全的存储空间,只能由应用自己访问。

4. 通过Intent获取文件:如果你通过Intent启动一个活动来选择文件,你可以在Intent的`getData()`方法中获取到文件的URI。

5. 使用FileProvider:如果你想为其他应用程序提供文件访问权限,可以使用FileProvider 来创建一个内容URI。

这样,其他应用可以通过这个URI来访问文件,而无需知道文件的实际路径。

6. 通过SQLite数据库:如果你正在开发一个需要大量本地存储的应用,可以考虑使用SQLite数据库来存储数据。

Android提供了SQLiteOpenHelper类来帮助管理数据库的创建和版本控制。

请注意,根据Android的存储权限和隐私策略,某些方法可能在不同的Android版本或设备上有所不同。

确保在应用中适当地请求和检查所需的权限,并在不同版本的Android上进行充分的测试。

01 Content Provider概述

01  Content Provider概述
wwwmrbccdcom2uri的用法contentprovider使用基于数据库模型的简单表格来提供其中的数据这里每行代表一条记录每列代表特定类型和含义的数据
Content Provider概述
本讲大纲: 1、数据模型 2、URI的用法
支er使用基于数据库模型的简单表格来提供其中的数据, 这里每行代表一条记录,每列代表特定类型和含义的数据。例如,联 系人的信息可能以如下方式提供:
URI的用法
每个Content Provider提供公共的URI(使用Uri类包装)来唯一标识其 数据集。管理多个数据集(多个表格)的Content Provider为每个都提 供了单独的URI。所有为provider提供的URI都以“content://”作为前缀, “content://”模式表示数据由Content Provider来管理。
Thank you
还有什么疑问可以到提出 也可以以发送邮件到 mingrisoft@

SettingsProvider

private void setPreferredApn(int pos) { String subId = Long.toString(mPhone.getSubId()); Uri uri = Uri.withAppendedPath(PREFERAPN_NO_UPDATE_URI_USING_SUBID, subId); log("setPreferredApn: delete"); ContentResolver resolver = mPhone.getContext().getContentResolver(); resolver.delete(uri, null, null); if (pos >= 0) { log("setPreferredApn: insert"); ContentValues values = new ContentValues(); values.put(APN_ID, pos); resolver.insert(uri, values); } }
What is SettingsProvider
• SettingsProvider是一个应用
\frameworks\base\packages\SettingsProvider\
• SettingsProvider继承自ContentProvider,封装了对设置模块数据的具体操 作。 • 其他应用可以使用标准的ContentResolver接口,来添加/删除/修改/查询 设置参数。
Apps ContentResolver Services ContentResolver Other Components ContentResolver
App_Provider ContentProvider

什么是icp?icp,因特网内容提供商英文为internetcontentprovider...

什么是ICP?ICP,因特网内容提供商英文为Internet Content Provider 简写为ICP,即向广大用户综合提供互联网信息业务和增值业务的电信运营商。

其必须具备的证书即为ICP证。

ICP证是指各地通信管理部门核发的《中华人民共和国电信与信息服务业务经营许可证》,也叫做《互联网信息服务业务经营许可证》,简称经营性ICP。

互联网信息服务,是指通过互联网,向上网用户有偿提供信息或者网页制作等服务活动。

(经营性ICP主要是指利用网上广告、代制作网页、出租服务器内存空间、主机托管、有偿提供特定信息内容、电子商务及其它网上应用服务等方式获得收入的ICP)。

ICP备案《非经营性互联网信息服务备案管理办法》指出在中华人民共和国境内提供非经营性互联网信息服务,应当依法履行备案(ICP备案)手续。

未经备案,不得在中华人民共和国境内从事非经营性互联网信息服务。

未备案,擅自运营网站者,会受到警告、关闭网站等不同程度的处罚。

【ICP域名备案】ICP备案又称域名备案其实就是一种网站备案手续,无经营性与非经营性之分,只要是在国内运行的网站,就必须办理备案手续。

一般情况下,ICP备案可由您的服务器托管商完成,托管商将相关数据提交到您服务器所在地通信管理局,通信管理局审核通过,将数据传给工业和信息化部,工业和信息化部核发备案号,例如:京ICP备××××××××号。

ICP域名备案分为公司域名备案和个人域名备案两种。

ICP备案办理材料如下:1、公司域名备案材料有网站真实性核验单; 主办单位证件(企业单位证件为:营业执照副本复印件;事业单位、机关单位和社会团体证件为:组织机构代码证复印件或社团法人证书复印件); 法人和网站负责人身份证的复印件; 授权书(网站负责人和法人不是同一人时); 域名证书; ICP备案信息登记/变更受理单; 网站负责人照片。

contentresolver notifychange 传参数

contentresolver notifychange 传参数ContentResolver的notifyChange()方法是Android平台中一个非常有用的方法,用于通知ContentProvider数据发生了变化。

这个方法允许我们在数据更新后,及时通知其他相关组件做出相应的改变。

本文将详细介绍ContentResolver的notifyChange()方法,并解释传参的方式及其使用。

首先,我们需要了解ContentResolver和ContentProvider之间的关系。

ContentResolver是一个用于访问ContentProvider的类,它充当了客户端和ContentProvider之间的中间人。

ContentProvider则提供数据的增删改查操作。

当我们对ContentProvider中的数据进行了修改后,我们需要通过ContentResolver的notifyChange()方法来通知其他组件相关数据的变化,以便及时刷新展示或做出其他操作。

在使用notifyChange()方法时,我们可以传入两个参数:uri和observer。

uri是用于指定变化的数据的地址,而observer是一个观察者对象,用于接收数据变化的通知。

我们可以通过注册一个ContentObserver来实现观察者模式,从而及时得到通知。

在具体使用时,我们可以通过以下方式传递uri参数:1. 传递整个表的uri:我们可以使用ContentProvider的getContentUri()方法来获取一个表的uri,然后传递给notifyChange()方法。

这样,当该表中的任何数据发生变化时,都会触发通知。

2. 传递特定数据行的uri:我们可以通过ContentUris的withAppendedId()方法,将一个特定的id与表的uri结合起来获取特定数据行的uri。

这样,当指定id的数据行发生变化时,就会触发通知。

Elastos中间件ContentProvider的设计与实现

Elastos中间件ContentProvider的设计与实现
马勇强;陈榕
【期刊名称】《电脑知识与技术》
【年(卷),期】2009(005)031
【摘要】Elastos是具有中国自主知识产权的面向服务的新型嵌入式网络操作系统.目前主要用嵌入式设备.多款基于Elastos的3G手机已经面世,一款基于Elastos的电子书也即将进入量产.本文提出了基于Elastos的ContentProvider,这是一种易于使用和扩展的应用程序数据访问模式,解决了在需求多变的市场背景下,手机应用程序如何方便的访问数据的问题.
【总页数】3页(P8719-8721)
【作者】马勇强;陈榕
【作者单位】同济大学基础软件工程中心,上海,200092;同济大学基础软件工程中心,上海,200092
【正文语种】中文
【中图分类】TP311
【相关文献】
1.WAP协议栈在Elastos平台上的设计与实现研究 [J], 张捷;陈榕
2.基于Elastos操作系统的图形引擎的设计与实现 [J], 张金焕;陈榕;张曼夕
3.Elastos中间件ContentProvider的设计与实现 [J], 马勇强;陈榕
4.基于光纤地波微震动探测系统的中间件设计与实现 [J], 何斌;贾渭娟
5.物联网数据服务中间件的设计与实现 [J], 吴宇
因版权原因,仅展示原文概要,查看原文内容请购买。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、ContentProvider简介
当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可
以向其他应用共享其数据。虽然使用其他方法也可以对外共享数据,但数据访问方式会因数
据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据;采用
sharedpreferences共享数据,需要使用sharedpreferences API读写数据。而使用ContentProvider
共享数据的好处是统一了数据访问方式。

二、Uri类简介
Uri代表了要操作的数据,Uri主要包含了两部分信息:1.需要操作的
ContentProvider ,2.对ContentProvider中的什么数据进行操作,一个Uri由以下几部分组成:

1.scheme:ContentProvider(内容提供者)的scheme已经由Android所规定为:
content://。
2.主机名(或Authority):用于唯一标识这个ContentProvider,外部调用者可以根
据这个标识来找到它。
3.路径(path):可以用来表示我们要操作的数据,路径的构建应根据业务而定,如
下:
• 要操作contact表中id为10的记录,可以构建这样的路径:/contact/10
• 要操作contact表中id为10的记录的name字段, contact/10/name
• 要操作contact表中的所有记录,可以构建这样的路径:/contact
要操作的数据不一定来自数据库,也可以是文件等他存储方式,如下:
要操作xml文件中contact节点下的name节点,可以构建这样的路径:/contact/name
如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:
Uri uri = Uri.parse("content://com.changcheng.provider.contactprovider/contact")

三、UriMatcher、ContentUrist和ContentResolver简介
因为Uri代表了要操作的数据,所以我们很经常需要解析Uri,并从Uri中获取数据。
Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher 和ContentUris 。掌握
它们的使用,会便于我们的开发工作。

UriMatcher:用于匹配Uri,它的用法如下:
1.首先把你需要匹配Uri路径全部给注册上,如下:
//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码(-1)。
UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//如果match()方法匹配
content://com.changcheng.sqlite.provider.contactprovider/contact路径,返回匹配码为1
uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact”, 1);//
添加需要匹配uri,如果匹配就会返回匹配码
//如果match()方法匹配
content://com.changcheng.sqlite.provider.contactprovider/contact/230路径,返回匹配码为2
uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact/#”,
2);//#号为通配符

2.注册完需要匹配的Uri后,就可以使用uriMatcher.match(uri)方法对输入的Uri进行
匹配,如果匹配就返回匹配码,匹配码是调用addURI()方法传入的第三个参数,假设匹配
content://com.changcheng.sqlite.provider.contactprovider/contact路径,返回的匹配码为1。

ContentUris:用于获取Uri路径后面的ID部分,它有两个比较实用的方法:
• withAppendedId(uri, id)用于为路径加上ID部分
• parseId(uri)方法用于从路径中获取ID部分

ContentResolver:当外部应用需要对ContentProvider中的数据进行添加、删除、修
改和查询操作时,可以使用ContentResolver 类来完成,要获取ContentResolver 对象,可以
使用Activity提供的getContentResolver()方法。 ContentResolver使用insert、delete、update、
query方法,来操作数据。

四、创建ContentProvider
要创建我们自己的Content Provider的话,我们需要遵循以下几步:
a. 创建一个继承了ContentProvider父类的类

b. 定义一个名为CONTENT_URI,并且是public static final的Uri类型的类变量,你必须为其指
定一个唯一的字符串值,最好的方案是以类的全名称, 如:
public static final Uri CONTENT_URI =
Uri.parse( “content://com.google.android.MyContentProvider”);

c. 定义你要返回给客户端的数据列名。如果你正在使用Android数据库,必须为其定义一个叫_id
的列,它用来表示每条记录的唯一性。

d. 创建你的数据存储系统。大多数Content Provider使用Android文件系统或SQLite数据库来
保持数据,但是你也可以以任何你想要的方式来存储。

e. 如果你要存储字节型数据,比如位图文件等,数据列其实是一个表示实际保存文件的URI字符串,
通过它来读取对应的文件数据。处理这种数据类型的Content Provider需要实现一个名为_data的
字段,_data字段列出了该文件在Android文件系统上的精确路径。这个字段不仅是供客户端使用,
而且也可以供ContentResolver使用。客户端可以调用ContentResolver.openOutputStream()
方法来处理该URI指向的文件资源;如果是ContentResolver本身的话,由于其持有的权限比客户
端要高,所以它能直接访问该数据文件。

f. 声明public static String型的变量,用于指定要从游标处返回的数据列。
g. 查询返回一个Cursor类型的对象。所有执行写操作的方法如insert(), update() 以及delete()
都将被监听。我们可以通过使用ContentResover().notifyChange()方法来通知监听器关于数据更
新的信息。
h. 在AndroidMenifest.xml中使用标签来设置Content Provider。
i. 如果你要处理的数据类型是一种比较新的类型,你就必须先定义一个新的MIME类型,以供
ContentProvider.geType(url)来返回。MIME类型有两种形式:一种是为指定的单个记录的,还有
一种是为多条记录的。这里给出一种常用的格式:

vnd.android.cursor.item/vnd.yourcompanyname.contenttype (单个记录的MIME类
型)
比如, 一个请求列车信息的URI如
content://com.example.transportationprovider/trains/122 可能就会返回
typevnd.android.cursor.item/vnd.example.rail这样一个MIME类型。

vnd.android.cursor.dir/vnd.yourcompanyname.contenttype (多个记录的MIME类型)
比如, 一个请求所有列车信息的URI如
content://com.example.transportationprovider/trains 可能就会返回
vnd.android.cursor.dir/vnd.example.rail这样一个MIME 类型。

相关文档
最新文档