




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、android 内容提供者 contentprovider 总结一.contentprovider 基础知识contentprovider作为android四大组件之一,相对其他 组件来说,应用的场合是最少的了,但是它是有自己独特的 作用的,比如为其他程序提供数据。contentprovider和其 他四个组件一样,使用自己编写的类时,要在 androidmanifest 里面注册。contentprovider内部如何保存数据由其设计者决定.但 所有的contentprovider都实现了一组通的方法来提供数据 的增删改查功能.客户端通常不会直接使用这些方法,大多数据是通过 contentr
2、esolver 对象实现对 contentprovider 的操作开发 人员可以通过调用activity或者其它应用程序组伯的实现 类中的 getcontentresolver ()方法 来获得 content provider 对象,如i: contentresolver cr=getcontentresolver();使用contentresolver提供的方法可以获得content provider中任何感兴趣的数据.不同进程之间通信由 contentprovider 类和contentresolver 类处理.(一)数据模型contentprovider使用基本数据库模型的简单表格来提
3、供 其中的数据,这里每行代表一条记录,每列代表特定类型和 含义的数据例如,联系人的信息可以如下idnamenumberemail001张三123*123*163 com002李四132*132*google. com003王五414*414*qq. com每条记录包含一个数值型的_id字段,它用于在表格中唯一标记该记录id每条记录包含一个数值型的_id字段,它用于在表格中唯 一标记该记录id能用于匹配相关表格中的记录,例如在一 个表格中查询联系人电话,在另一个表格中查询照片 查询 返回一个cursor对象,它能遍历各行各列来读取各个字段的 值对于各个类型的数据,cursor对象都提供专用的方法
4、.因此,为了读取字段的数据,开发人员必须知道当前字段 包含的数据类型。其实这个增删改查的操作实现和android数据库的操作 是底层实现是一样的,只是我们客户端操作调用的是写好的 方法来实现,基本的数据的关键字还是要我们自己来填写的。(二)uri的用法对于contentprovider来说uri是非常需要理解的知识。在电脑术语中,统一资源标识符(uniform resource identifier,或uri)是一个用于标识某一互联网资源名称 的字符串。该种标识允许用户对任何(包括本地和互联网) 的资源通过特定的协议进行交互操作。uri由包括确定语法 和相关协议的方案所定义。每个content
5、provider提供公共的uri来唯一标识其数据 集,管理多个数据集(多个表格)的contentprovider为每个 都提供了单独的uri.也就是说每一个uri对于一个表格,我们可以通过某个 uri来实现对某个表格进行相应的操作,比如找到电话号码 表格的uri才能读取里面的通话数据。所提供的uri都以content:/作为前缀” content:/” 模式表示数据由content provider来管理 如果自定义 content provider,则应该也是其uri定义一个常量,以简化 客户端代码并让日后更 新更加简洁.android为当前平台提供的content provider定义了
6、content_uri常量.匹配电话号码到联系人表格的uri和匹 配保存联系人照片表格的uri分别如下. android, provider. contacts. phones. content. uri; android, provider. contacts. photos. content. uri;uri常量用于所有与content provider的交互中.每个 contentresolver方法使用uri作为其第一个参数.它标识 contentresolver应该使用哪个provider以及其中的哪个表 格.下面是content uri重要部分的总结比女口 uri: content
7、:/com. hua. employeeprovider/dba/001上面的uri分四部分第一部分:标准的前缀(content:/),用于标识该数据由 content provider管理,它永远不用修改。第二部分:uri的authority部分,它标识该content provider.对于第三方应用,该部分一般是完整的包名(小写) 来保证唯一性。女口果是自定义的 contentprovider 要在 androidmanifest 中的 provider 声明 authority.第三部分:content provider的路径部分,用于决定哪类 数据被请求,如果contentprovi
8、der仅提供一种数据类型,这 部分可以没有如果提供几种类型,包括子类型,这部分可以 由几部分组成.比如对数据库不同表格或对表格的不同操作 都可以使用路径来区分。第四部分:被请求的特定的记录的id值.这是被请求记录 的_id值.如果请求不仅限于单条记录该部分及前面的斜线 应该删除。二.系统中预定义的contentproviderandroid系统为常用数据类型提供了很多预定义的contentprovider(声音,视频,图片,联系人),它他大部分位于android, provider包中,开发人员可以查询这些 provider经获得其中包含的信息.android系统提供的常见content pr
9、ovider 说明如下1. browser:读取或修改书签,浏览历史或网络搜索.2. calllog:查看或更新通话历史.3. contacts:获取、修改或保存联系人4. livefolders:由 content provider 提供 内容的特定文 件夹5. mediastrore:访问声音,视频和图片6. setting:查看和获取蓝牙设置,铃声和其它设备偏好.7. earchrecentsuggestions:该类能为应用程序创建简单 的查询建议提供者,它基于近期查询提供建议.8. syncstatecontract:用于使用数据数组帐号关联数据 的content provider约
10、束,希望使用标准方式保存数据的 provider可以使用它.9. userdictionary:在可以预测文本输入时,提供用户定义的单词给输入法使用应用程 序和输入法能增加到该字 典,单词能关联频率信息和本地化信息.其中上面大部分的contentprovider并不常用,常看联系 人信息是比较常用的。二查询数据在 contentprovider中查询数据,开发人员需要知道以下1=1信息:(一) 标识该 content provider 的 uri(二) 需要查询的数据字段名称和字段中数据的类型如果需要查询特定记录,那么还需要知道该记录的id值.一般使用contentresolver对象的que
11、ry ()方法完成查询 功能,都返回cursor对象.query ()方法的声明如下public final cursor query(uri uri, string projection, stringselection,string selectionargs, string sortorder)参数一:uri:用于查询的 content providerr uri 值参数二:projection:由需要查询的列名组成的数组,如果为null则不胜枚举查询全部列参数三:selection:类似sql中的where子句,用于增加条件来完成数据过虑参数四:selectionargs:用于替换se
12、lection中可以使用? 表示的变量值参数五:sortorder:类似sql中的order by子句,用于 实现排序功能返回值:cursor对象,它位于第一条记录之前,或者为 null为了限制仅返回一条记录,可以在url结尾加该记录的 _id值,即将匹配id值的字符串作为uri路径部分的结尾片 段.四. 自定义 contentprovider如果开发人员希望共享自己的数据,可以自定义content provider步骤如下建立数据存储系统,大多数contentprovider使用 android文件存储方法或者sqlite数据库保存数据,但是开 发人员可以使用任何方式存储.(一)使用自定义的
13、contentprovider必须要做的:1. 继承contentprovider类来提供数据访问方式。实现contentprovider里面的六个方法,(1) 重写oncreate方法里面创建数据库(2) 重写增删改查操作的方法,也可以不用全部重写, 比如你只想让其他程序访问本程序的数据,而不能进行其他 的操作,只需要重写query方法就可以了,其他方法可以不 重写。2. 在应用程序的androidmanifest文件中声明contentprovidero代码如下:<providerandroid:name= mycontentprovider"android: author
14、 it ies=zzcom lwz provider"android:exported二true" />如果想要外部能访问自己程序的资源上面三个属性是必 须要设置的。自定义的uri用到的知识相对就比较多一点,如果是多表, 又有增删改查各种操作,必须对uri进行比较全面的定义和 规范使用。(二)urimatcherurimatcher类主要用于规范匹配urio比如给uri添加路径和id号。系统判断到相应的类别就做相应的操作。使用方法如下。1 初始化:urimatchermatcher=newurimatcher(urimatcher. n0_match);2.注册需要的
15、uri:matcher adduri(com whunf, "people", people);或 matcher adduri ("com whunf''person/people_id);一个表的不同操作可以注册多个uri。3与已经注册的uri进行匹配:(1) uri uri 二 uri. parse ("content:/+"com. whunf" + "/people");这个uri是访问者填写的。(2 ) int match = matcher .match (uri);这里的match是
16、在contentprovider里面定义的,做判断 和匹配也是在contentprovider里面进行的。switch (match)case people:return vnd. android. cursor dir/people/z;case people_id:return vnd android cursor item/people;default:return null:match方法匹配后会返回一个匹配码code,即在使用注册 方法adduri时传入的第三个参数。上述方法会返回 z/vnd. android. cursor dir/person总结:常量urimatcher. n
17、o match表示不匹配任何路径的返回#号为通配符*号为任意字符官方sdk说明中关于uri的注册是这样写的:private static finalurimatchersurtmatcher = newurimatcher (urimatcher. no_matcii);static sur i matcher. adduri (z/contactsz,,"/people",people);surimatcher. adduri("contacts", "/people/#", people id);surtmatcher. addu
18、ri (,zcontacts/z, /people/#/phones", people piione s); surimatcher. adduri (''contacts'', "/people/#/phones/#,people_pi1o nes_id); slrimatcher adduri ("contacts", /people/#/contact methods'7, peo ple_contactmethods);surimatcher. adduri("contacts", eo
19、ple contactmethods td);surtmatcher. addurt("contacts", surimatcher. adduri("contacts", surimatcher. adduri("contacts", surimatcher adduri("contacts", surtmatcher. adduri("contacts", surimatcher. adduri("contacts", surimatcher. adduri (/zcal
20、l_logz,, surimatcher. adduri(call_log,"/people/#/contiict methods/p/deleted_peopl"/phones","/phones/fi1 ter/*", "/phones/con tactmethods77,/contact_methods/“/calls”,"/calis/fiiter/*",deleted_peopl e); phones);phones_filter);phones id);contactmethods);contactme
21、t iiods_id);calls);calls_f1lter) ;vcalls/#', calls id);surimatcher. adduri ("call log",其实上面只是提供一种书写的规范,提供我们参考。也可 以按照自己的思路来注册urio(三) content uriscontenturis类用于获取uri路径后面的id部分 为路径加上 id 的方法:withappendedld(uri, id) 比如有这样一个uriuri uri = uri. parse(z/content :/com. whunf/people)通过withappendedl
22、d方法,为该uri加上id1. uri resuituri 二 contenturiswithappendedld(uri, 10);最后 resulturi 的字符串为: content:/com whunf/people/10从路径中获取id: parseld(uri)1. uriuri=uri. parse ("content:/com. whunf/people/10z,)2. long personid = contenturisparseld(uri);最后 personid 为:10五.下面是一个访问手机联系人的信息的使用示例 程序分析:手机联系人的信息是在androi
23、d中某个固定的位置的,它的uri也是系统规定好的,需要我们去查。手机联系人里面不止一个表,字段也很多,这个也是需要 我们了解后,才能取得它对应的信息。里面很多信息我们可以把手机电话信息的数据导出后再, 研究里面的元素,这里打开手机数据库文件的工具一般使用 的是:sqlite expert professional 视图根据。下面是查询所有用户的姓名和号码的java代码package com. lwz. provider;import android content. contentresolver;import android content. contentvalues;import and
24、roid, database cursor;import androidnet> uri;import androidos. bundle;import android provider. contactscontract;import android support. v7 app appcompatactivity;import android, util.log;import java, uti la rraylist;import javauti1. list;public class mainactivity extends appcompatactivity ©ov
25、errideprotected void oncreate (bundle saved!nstancestato) super. oncreate(savedlnstancestale); setcontentview(r. layout, activity main);操作电话本数据 selectphoneo ;private void selectphoneo /获得 contentresol ver 对彖contentresolver resolver = getcontentresolver();/获得系统定义的电话某一个表格的uri (这里対应的是数据库的contacts表,这个表主
26、要数存放用户的id)uri uri = contactscontract. contacts. content_uri;/这是系统类定义好的 字符串的uriuri/获取该uri下的信息cursor cursor = resolverquery(uri, null, null, null, null);/创建一个list集合存放用户对彖的数据list<user> list = new arraylisto();遍历取出数据,这里涉及到多表查询,因为数据存储是分类在多个表屮 whi 1 e (cursor. movetonext () /获得用户的id,参数数字段名称的字符串longi
27、dcursor. getlong(cursor. getcolumnlndex(''nameaw contact_id");/log. e("tag", "id二"+ id);/创建一个user来存储信息user user = new user();user, id = id;/根据获取的到的用户的id,来分别获取它的数据,这些数据又是在另 一个表中/获得系统定义的电话某一个表格的uri (这里对应的是数据库的data 表,这个表里面有最全面的信息)/正是因为由于血询表里面的数据最多,所以显示或排列的顺序不一定 正常,需要我们提
28、供一个td來查找对应的数据uri uri2 = contactscontract. data. content_uri;/等同uriuri2=ur i. parse (z/c onten t: /com. an droid, con tacts/datazz );根据刚才获得的用户的id值来分别获取对应的数据/获取该u"2下的信息/ string d二contactscontract. contacts. data. raw_contact_id;这里的 字符串d等同于z,raw contact id"cursor cursor2 = resolver.query(uri2
29、, null, "raw_contact_id二?", new stringid +null);获取每一个用户id里面某些信息while (cursor2. movetonext() 获取用户的姓名/contactscontract. contacts. display_name->"di splay_name,zuser, namecursor2. getstring(cursor2. getcolumnlndex("display name");/ contactscontract. data. data1>"data
30、luser, phone, add(cursor2. getstring(cursor2. getcolumnlndex ("clatal");1 ist. add (user);/打卬输出内容for (int i = 0; i < list. size(); i+) log. e("tag", list, get (i). tostring();/创建一个用户信息类 class user long id;/用户的 tdstring name;/用户的姓名list<string> phone = new arraylisto() ;/用
31、户的多个号码显示用户的数据©overridepublic string tostringo return "user" +id= + id +,name= + name +"、phone二"+ phone +在手机联系人中,每添加一个用户信息都会对应一个id, 但是这条信息可以包含多个用户的名称或多个号码,我们只 需要取其中的一部分就可以了。为了更好的去熟悉相关数据的操作,最好是把数据库的文 件,导出来,看看数据的结构。android程序安装的文件都放在/data/date路径下,系统的提供的所有contentprovider也在这个包下:52
32、016-10-19072016-10-19072016-10-19072016-10-1907> d tips> 0 viders.calendar> viders.contactsv viders.downloads耳 viders.downloads.ui> e viders.mediad viders.settings> d com.android.p
33、roviders.telephony> 3 viders.userdictionary“ ufll.ailmf viu.ncipccu:” 3 com.android.packageinstaller> 3 com.android.pacprocessor> 厶 com.android.phone> d com.android.printspooler凸 xyhandler> & com.android.quicksearchbox2016-10-19 07 2016-10-19072016-10
34、-19072016-10-19072016-10-19 07 2016-10-19072016-10-19072016-10-19072016-11-07022016-10-19 072016-10-19072016-10-19 07> b com.android.sdksetup上面的几个包名,都有providers ,这是系统的contentprovider程序包,里面包含相关的数据库文件。比如:联系人的信息在 com. android, provider, contacts 包内。 其他的包有的是下载过得文件数据,有的是手机拨号记录数据,有的是浏览器历史记录数据等等。导出手机联系人的数据库方法:芟 threads heap i® allocation .歹 network s iff1 file explor.二 q emulatorf system in仁 sw <8 1 -1 pnameme permissions a> g com.android.printspooler& viders.calendar厶 3 viders.contacts ache 3 databasescontacts2.dblj contacts2.d
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- YY 0459-2025外科植入物丙烯酸类树脂骨水泥
- 新疆北庭希望环保科技有限公司吉木萨尔县25万吨-年危废处理利用项目(2)环评报告
- 某著名企业DeepSeek系列09DeepSeek政务应用场景与解决方案
- 工业废水处理与绿色工艺技术
- 工业废气治理技术与方法探讨
- 工业大数据的分析与应用
- 工业建筑设计及自动化机电系统
- 工业污染防治与绿色制造技术分析
- 工业网络通信协议与技术标准
- 工业生产中的设备优化管理
- 培训学校教师考核与管理制度
- 创伤性硬膜下出血的护理查房
- 企业食堂安全培训课件
- 解放汽车销售合同范例
- 2024-2030年中国压滤机行业发展前景调研与投资策略分析报告
- 血管导管相关感染预防与控制指南课件
- 胃癌教育课件
- 《光伏电站运行与维护》课件-项目五 光伏电站常见故障处理
- 《食物在身体里的旅行》(教案)四年级上册科学教科版
- 汽车以租代购合同
- 人教版二年级下册口算题1000题大全
评论
0/150
提交评论