android开发课件:数据存储与访问-CP_第1页
android开发课件:数据存储与访问-CP_第2页
android开发课件:数据存储与访问-CP_第3页
android开发课件:数据存储与访问-CP_第4页
android开发课件:数据存储与访问-CP_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据存储与访问-CPCP简介生成一个简单的CP类使用CP类Android中的CP类以电话簿为例CP简介Android中的Contentprovider(简称CP)机制可支持在多个应用中存储和读取数据。这也是跨应用共享数据的唯一方式。在android系统中,没有一个公共的内存区域,供多个应用共享存储数据。如果需要在多个应用中共享数据,在Android中,只有通过Contentprovider机制。ContentProvider是用于将数据共享给其他应用。例如在同一部手机里面,有两个APP,第一个APP要访问第二个APP的数据。此时,第二个APP就需要设置ContentProvider。这样,第一个APP就能通过Uri访问第二个APP的数据使用CP的优点如果采用文件操作模式对外共享数据,数据的访问方式会因数据存储的方式而不同,导致数据的访问方式无法统一,如:采用xml文件对外共享数据,需要进行xml解析才能读取数据;采用sharedpreferences共享数据,需要使用sharedpreferencesAPI读取数据。使用ContentProvider对外共享数据的好处是统一了数据的访问方式。ContentProvider完全屏蔽了数据提供组件的数据存储方法在使用者看来,数据提供者通过ContentProvider提供了一组标准的数据操作接口,却无法得知数据提供者的数据存储方数据提供者可以使用SQLite数据库存储数据,也可以通过文件系统或SharedPreferences存储数据,甚至是使用网络存储的方法,这些内容对数据使用者都是不可见同时也正是因为屏蔽数据的存储方法,很大程度上简化的ContentProvider的使用难度,使用者只要调用ContentProvider提供的接口函数,就可完成所有的数据操作CP数据模型ContentProvider的数据模式似于数据库的数据表,每行是一条记录,每列具有相同的数据类型每条记录都包含一个长型的字段_ID,用来唯一标识每条记录ContentProvider可以提供多个数据集,调用者使用URI对不同的数据集的数据进行操作ContentProvider数据模型_IDNAMEAGEHEIGHT1Tom211.812Jim221.78生成CP类在项目名中右键,选择New->Other->AndroidObject,选择ContentProvider。URIAuthorities:表示CP类的唯一标识。一般用包名+CP类的类名组合,保证唯一性。Manifest.xml文件的变化与Activity、Service、BroadcastReceiver等几大Android组件一样,新生成的CP类也需要在AndroidManifest.xml文件中进行注册。当你上述导航的方式创建CP类时,系统会为你自动注册。如下所示,XML文件中多了以下几行实现CP类要实现CP类,就必须重载CP类的几个重要函数。基本上,这些函数主要用于数据库的操作,如下页的图所示。注意:等你写代码时,要把每个函数中缺省的那条thrownewXxxexception语句去掉。否则会抛出异常。等完成重载上述函数后,就可以使用CP类了。新建立的类继承ContentProvider后,共有六个函数需要重载delete():删除数据集insert():添加数据集qurey():查询数据集update():更新数据集onCreate():初始化底层数据集和建立数据连接等工作getType():返回指定URI的MIME数据类型,如果URI是单条数据,则返回的MIME数据类型应以vnd.android.cursor.item开头如果URI是多条数据,则返回的MIME数据类型应以vnd.android.cursor.dir/开头具体实现时,删除该句。如果不想写具体代码,可以用return0代替。具体实现定义数据库相关信息。定义URI创建DB,并插入一点数据实现了简单的查询关于URIURI是通用资源标志符(UniformResourceIdentifier),用来定位任何远程或本地的可用资源上面的URI是便于Contentprovider调用者引用的,下面使用Contentprovider的时候能看到。每个contentprovider定义一个唯一的公开的URI,用于指定到它的数据集。这些URI要以这样的格式开头:content://如果你想创建自己的contentprovider,最好把自定义的URI设置为类的常量,这样简化别人的调用,并且以后如果更新URI也很容易。android定义了CONTENT_URI常量用于URI。AndroidManifest.xml中CP注册时的android:authorities属性就是CONTENT_URI的值URI介绍(1)简单的说,Uri类似于网址,代表了你要查询的数据的地址。它的格式如下图所示。Scheme:对于ContentProvider来说不变,统一为“content://”。Authority:即你想要操作的数据库所在的“主机”,或者说授权,是唯一标示符。格式一般是ContentProvider类的完全限定名称,比如edu.HZNU.cptest。URI介绍(2)路径:表示更具体的数据库中的表,甚至表中的某一行数据。路径的构建应该根据需要而定,比如:URI介绍(3)要把一个字符串转换为Uri,可以用Uri类中的parse()方法。Uriuri=Uri.Parse(“content://edu.HZNU.cptest”);URI相关函数-UriMatcher由名字可知,UriMatcher用于Uri之间的匹配。它的用法很简单:创建一个UriMatcher类,并利用addURI函数为该类赋予相应的默认Uri。注意,添加默认Uri时,可以是单个记录的Uri,也可以是一个集合。最后利用该类的Match将默认的Uri与输入的Uri进行比对,看是否相同。Match函数返回的代码可以确定Uri指向的是单个记录,还是集合。集合单个记录publicvoidaddURI(Stringauthority,Stringpath,intcode)authority表示匹配的授权者名称;path表示数据路径;#可以代表任何数字;code表示返回代码URI相关函数-ContentUrisContentUris类用于操作Uri路径后面的ID部分,它有两个比较实用的方法:withAppendedId(uri,id)用于为路径加上ID部分;parseId(uri)方法用于从路径中获取ID部分。使用CP调用者不能够直接调用ContentProvider的接口函数,而需要使用ContentResolver对象,通过URI间接调用ContentProvider。下图是ContentProvider调用关系使用CP-查询使用的时候是在Activity里面调用getContentResolver()函数实现的。可以利用query,insert,update等函数实现针对CP的数据库操作。通过这个Uri参数,android可定位到具体的ContentProvider并启动它(如果没有启动的话)程序开发人员使用ContentResolver对象与CP进行交互,而ContentResolver则通过URI确定需要访问的CP的数据集在发起一个请求的过程中,Android首先根据URI确定处理这个查询的ContentResolver,然后初始化ContentResolver所有需要的资源,这个初始化的工作是Android系统完成的,无需程序开发人员参与一般情况下只有一个ContentResolver对象,但却可以同时与多个CP进行交互使用CP-添加数据向ContentProvider中添加数据有两种方法一种是使用insert()函数,向ContentProvider中添加一条数据另一种是使用bultInsert()函数,批量的添加数据下面的代码说明了如何使用这两个函数添加单条数据ContentValuesvalues=newContentValues();values.put(KEY_NAME,"Tom");values.put(KEY_AGE,21);values.put(KEY_HEIGHT,);UrinewUri=resolver.insert(CONTENT_URI,values);ContentValues[]arrayValues=newContentValues[10];//实例化每一个ContentValuesintcount=resolver.bultInsert(CONTENT_URI,arrayValues);使用CP-删除数据删除操作需要使用delete()函数如果需要删除单条数据,则可以在URI中指定需要删除数据的ID如果需要删除多条数据,则可以在selection中声明删除条件下面代码说明了如何删除ID为2的数据Uriuri=Uri.parse(CONTENT_URI_STRING+"/"+"2");intresult=resolver.delete(uri,null,null);Android中的CP类许多Android系统的内置数据也通过ContentProvider提供给用户使用,例如通讯录、音视频文件和图像文件等比如,手机中的联系人名单,可能存在一张如下的表中,其中_ID是主键。通过Android提供的ContentResolver类,我们就可以访问手机中所有ContentProvider类提供的各种共享数据。因此我们可以在自己的Android程序中,利用CP类读取手机中的联系人名单。注意,在运行模拟器前,要确保AndroidManifest.xml中加入通讯录读取权限,否则代码会报错。下图分别是添加了读取联系人权限,和拨打电话权限。读取手机中的联系人名单使用相应的CP时,相关的Uri可以使用android自定义的,也可以使用Uri.parse生成的。另外,系统中已经定义了一些表和相应的字段,比如Contac

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论