第07章Android中的数据存储4.

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第7章Android中的数据存取7.4CONTENTPROVIDER共享数据随着手机上应用的增多,往往在不同的应用之间需要共享数据,比如有一个短信群发的应用,用户需要选择收件人,一个个手机号码输入当然可以达到目的,但是比较麻烦,并且很少有人会记住所有联系人的号码。这时候如果能够获取联系人信息,那就非常方便了。对于应用之间数据的共享,我们可以在一个应用中直接操作另一个应用所记录的数据,比如前面所学的文件、SharedPreferences或数据库等,但这不仅需要应用程序提供相应的权限,而且还必须知道应用程序中数据存储的细节,不同应用程序记录数据的方式差别也很大,不利于数据的交换。针对这种情况,Android提供了ContentProvider,它是不同应用程序间共享数据的标准API,统一了数据访问方式。那么ContentProvider是如何对外提供数据的呢?又是如何实现这一机制的呢?ContentProvider以某种URI的形式对外提供数据,数据以类似数据库中表的方式暴露,允许其他应用访问或修改数据;其他应用程序使用ContentResolver根据URI去访问操作指定的数据。URI是通用资源标识符,即每个ContentProvider都有一个唯一标识的URI,其他应用程序的ContentResolver根据URI就知道具体解析的是哪个ContentProvider,然后调用相应的操作方法;ContentResolver的方法内部实际上是调用该ContentProvider的对应方法,而ContentProvider方法内部是如何实现的,其他应用程序是不知道具体细节的。只是知道有这个方法。这就达到了统一接口的目的。对于不同的数据的存储方式,该方法内部的实现是不同的,而外部访问方法都是一致的。7.4.1CONTENTPROVIDER简单介绍ContentProvider是Android四大组件之一,如果要开发自己的ContentProvider必须实现Android系统提供的ContentProvider基类,并且需要在AndroidManifest.xml文件中进行配置。1、继承ContentProvider并重写增、删、查、改等方法;2、在AndroidManifest.xml使用provider对该ContentProvider进行配置。manifest....application....providerandroid:name=.MyProviderandroid:authorities=iet.jxufe.cn.android.provider.myprovider//application/manifest注意:authorities是必备属性,如果没有authorities属性程序会报错。ContentProvider基类的常用方法publicabstractbooleanonCreate():该方法在ContentProvider创建后调用,当其他应用程序第一次访问ContentProvider时,ContentProvider会被创建,并立即调用该方法;publicabstractCursorquery(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsortOrder):根据Uri查询符合条件的全部记录,其中projection是所需要获取的数据列;publicabstractintupdate(Uriuri,ContentValuesvalues,Stringselect,String[]selectArgs):根据Uri修改select所匹配的全部记录;publicabstractintdelete(Uriuri,Stringselection,String[]selectionArgs):根据Uri删除符合条件的全部记录;publicabstractUriinsert(Uriuri,ContentValuesvalues):根据Uri插入values对应的数据,ContentValues类似于map,存放的是键值对;publicabstractStringgetType(Uriuri):该方法返回当前Uri所代表的数据的MIME类型。如果该Uri对应的数据包含多条记录,则MIME类型字符串应该以vnd.android.curor.dir/开头,如果该Uri对应的数据只包含一条记录,则MIME类型字符串应该以vnd.android.cursor.item/开头。7.4.2CONTENTPROVIDER操作常用类介绍Uri代表了要操作的数据,Uri主要包含了两部分信息:1、需要操作的ContentProvider;2、对ContentProvider中的什么数据进行操作。一个Uri由以下几部分组成:scheme:ContentProvider(内容提供者)的scheme已经由Android所规定,scheme为:content://content://iet.jxufe.cn.android.providers.personprovider/person/10scheme主机名或authority路径ID主机名(或叫Authority)用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。路径(path)用于确定我们要操作该ContentProvider中的什么数据,一个ContentProvider内可能包含多种数据,路径的构建应根据业务而定,例如:要操作person表中id为10的记录,可以构建这样的路径:/person/10要操作person表中id为10的记录的name字段,路径为:/person/10/name要操作person表中的所有记录,可以构建这样的路径:/person要操作xxx表中的记录,可以构建这样的路径:/xxx注意:要操作的数据不一定来自数据库,也可以是文件、xml或网络等其他存储方式。ID:该部分是可选的,用于指定操作的具体是哪条记录,如果没有设置,则操作的是所有记录。7.4.2ContentProvider操作常用类介绍如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,例如:Uriuri=Uri.parse(content://iet.jxufe.cn.myprovider/person);由于Uri代表了要操作的数据,所以我们经常需要解析Uri,并从Uri中获取数据。Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher和ContentUris。掌握它们的使用,会便于我们的开发工作。7.4.2ContentProvider操作常用类介绍UriMatcher类用于匹配Uri,它的用法如下:1、注册所有需要匹配的Uri路径:2、注册完需要匹配的Uri后,就可以使用myUri.match(uri)方法对输入的Uri进行匹配,如果匹配就返回匹配码,匹配码是调用addURI()方法传入的第三个参数,假设匹配content://iet.jxufe.cn.providers.myprovider/person路径,返回的匹配码为1。UriMatchermyUri=newUriMatcher(UriMatcher.NO_MATCH);//创建UriMather对象,常量UriMatcher.NO_MATCH表示不匹配任何路径的//返回码,该常量值为-1。myUri.addURI(“iet.jxufe.cn.providers.myprovider”,“person”,1);//添加需匹配的Uri,如果match()方法匹配ontent://iet.jxufe.cn.providers.//myprovider/person路径,返回匹配码为1。myUri.addURI(“iet.jxufe.cn.providers.myprovider”,“person/#”,2);//添加需匹配的Uri,#号为通配符,表示匹配任何ID的Uri,如果匹配则返回2,//例如如果匹配content://iet.jxufe.cn.providers.myprovider/person/230//路径,返回匹配码为27.4.2CONTENTPROVIDER操作常用类介绍ContentUris类用于获取Uri路径后面的ID部分,它有两个比较实用的方法:withAppendedId(uri,id)用于为路径加上ID部分:Uriuri=Uri.parse(“content://iet.jxufe.cn.personprovider/person”);UriresultUri=ContentUris.withAppendedId(uri,10);//生成的Uri:为content://iet.jxufe.cn.personprovider/person/10parseId(uri)方法用于从路径中获取ID部分:Uriuri=Uri.parse(“content://iet.jxufe.cn.personprovider/person/10”);longpersonid=ContentUris.parseId(uri);//获取的结果为:107.4.2ContentProvider操作常用类介绍ContentProvider的作用是暴露可供操作的数据,其他应用程序主要通过ContentResolver来操作ContentProvider所暴露的数据,ContentResolver相当于客户端。ContentResolver是一个抽象类,是不能直接实例化的,那么我们如何得到ContentResolver实例呢?Android中Context类提供了getContentResolver()方法用于获取ContentResolver对象。然后即可调用其增删查改方法进行数据操作。一般来说,ContentProvider是单例模式的,当多个应用程序通过ContentResolver来操作ContentProvider提供的数据时,ContentResolver调用的数据操作将会委托给同一个ContentProvider处理。使用ContentResolver操作数据的步骤:调用Activity的getContentResolver()获取ContentResolver;根据需要调用ContentResolver的insert()、delete()、update()和query()方法操作数据。7.4.2ContentProvider操作常用类介绍ContentValues类和Java中的Hashtable类比较相似,都是负责存储一些键值对,但是它存储的键值对当中的键是一个String类型,往往是数据库的某一字段名,而值都是一些简单的数据类型。当我们向数据库中插入一条记录时,可以将这条信息的各个字段值放入ContentValues,然后将该ContentValues直接插入数据库。而不用拼接SQL语句或使用占位符一一赋值。7.4.2ContentProvider操作常用类介绍7.4.3案例为备忘录添加ContentProvider以一个具体的示例演示如何创建自己的ContentProvider,我们为备忘录示例创建ContentProvider,使得其他应用程序可以访问和修改它的数据。7.4.3案例向通讯录中添加联系人的事件处理代码,由于通讯录中用户名和号码存放于不同的表中,是根据联系人ID号关联起来的。因此,我们先向联系人中添加一个空的记录,产生新的ID号,然后根据ID号分别在两张表中插入相应的数据。publicvoidaddPerson(){StringnameStr=name.getText().toString();StringnumStr=num.getText().toString();Con

1 / 31
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功