Android四大组件之ContentProvider

生活中广大人因为当了小姑,有了宝贝从此,就无法做整治了。因为“熊孩子”时不时就会来闹事,扩展整理收纳难度,但实质上这是一种认知上的偏向。

Android四大组件之ContentProvider

为了在应用程序之间交流数据,Android提供了ContentProvider,它是例外应用程序之间展开数据交流的专业API,当一个应用程序需要把团结的多寡表露给此外程序行使时,该应用程序就可由此提供ContentProvider来实现;其他应用程序就可由此ContentResolver来操作ContentResolver暴露的数目。

在扶桑的小孩子教育中,有“食育”“智育”和“木育”等对此大家一齐陌生的定义。而在2015年的时候又指出了一个新的概念:收育。其定义是有教无类子女收拾物品的最重要,作育孩子整理物品的习惯。例如,不管是学习依旧外出,日本的小学生们很小的时候就起来被要求自己收拾书包和行李;在母校,吃完饭后,学生需要协调收拾餐具、收拾餐桌,等等。

ContentProvider简介

ContentProvider是见仁见智应用程序之间展开数据交流的正儿八经API,ContentProvider以某种Uri的样式对外提供数据,允许任何使用访问或改动数据;其他应用程序使用COntentResolver按照Uri去做客操作指定数量。

只要某个应用程序通过COntentProvider显露了团结的多少操作接口,那么不管该应用程序是否启动,其他应用程序都可透过该接口来操作该应用程序的其中数据,包括扩大多少、删除数据、修改数据、查询数据等。

ContentResolver只是提供数据的拜会接口,并不是像网站相同对外提供整机的页面。开发一个ContentProvider的步调如下所示:

  1. 概念自己的ContentProvider类,该类需要继承Android提供的ContentProvider基类。
  2. 向Android系统登记ContentProvider,即在AndroidManifest.xml文件中注册这个ContentProvider,就想注册Activity一样。注册ContentProvider时需要为它绑定一个Uri。

除却,自己定义的ContentProvider类还索要提供如下多少个办法:

  • public boolean
    onCreate():
    该格局在ContentProvider创设后会被调用,当其他应用程序第一次访问ContentProvider时,该ContentProvider会被创制出来,并及时回调该onCreate()方法。
  • public Uri insert(Uri uri ,ContentValues
    values):
    据悉该Uri插入values对应的数码。
  • public int delete(Uri uri ,String selection ,String[]
    selectionArgs):
    按照Uri删除selection条件所匹配的百分之百记录。
  • public int update(Uri uri ,ContentValues values ,String selection
    ,String[]
    selectionArgs):
    据悉Uri修改selection条件所匹配的任何记下。
  • public Cursor query(Uri uri ,String[] projection ,String
    selectionn ,String[] selectionArgs ,String
    sortOrder):
    基于Uri查询出selection条件所匹配的满贯记下,其中projection就是一个列名列表,注脚只采纳出指定的数据列。
  • public String getType(Uri
    uri):
    该方法用于再次来到当前Uri所代表的数目标MIME类型。如若该Uri对应的数码或者包括多条记下,那么MIME类型字符串应该以vnd.android.cursor.dir/起始;虽然该Uri对应的多少只含有一条记下,那么MIME类型字符串应该以vnd.android.cursor.item/先导。

对此,加州理工高校的学者也一度做过一项调研商讨,得出一个触目惊心的下结论:爱干家务的儿女和不爱干家务活的儿女,成年过后的就业率为15∶1,犯罪率是1∶10。爱干家务活的孩子,离婚率低,心境疾病患病率也低。另有我们提议,在男女的成长过程中,家务劳动与儿女的动作技能、认知能力的迈入以及责任感的培训具有紧密的关系。

Uri简介

ContentProvider要求的Uri与互联网的URL类似,例如如下Uri:

content://org.crazyit.providers.dictprovider/words

它可以分为如下三有的:

  • content://:其一有些是Android的ContentProvider规定的,就像是上网的合计默认是http://一样。暴露ContentProvider、访问ContentProvider的协议默认是content://。
  • org.crazyit.providers.dictprovider:这么些部分就是COntentProvider的authorities。系统就是由这个有些来找到操作哪个ContentProvider的。只要访问指定的ContentProvider,这多少个局部就是定位的,
  • words:资源部分(或者说数据部分)。当访问者需要拜访不同资源时,那么些部分是动态改变的。

为了将一个字符串转换成Uri,Uri工具类提供了parse()静态方法。例如,如下代码即可将
字符串转换为Uri:

Uri  uri = Uri.parse("content://org.crazyit.providers.dictprovider/word/2")

孩子学会整理收纳到底有什么好处吗?

ContentResolver操作数据

ContentProvider的功力是表露可供操作的数额;其他应用程序则通过ContentProvider来操作ContentProvider所暴露的多少,ContentResolver相当于HttpClient。
Context提供了如下方法来取得ContentResolver对象:

  • getContentResolver():获取该采取默认的ContentResolver对象。

如若在先后中拿走了ContentResolver对象之后,接下去就可调用ContentResolver的如下方法来操作数据了。

  • insert(Uri uri ,ContentValues
    values):
    向Uri对应的ContentProvider中插入values对应的数额。
  • delete(Uri uri ,String where ,String[]
    selectionArgs):
    除去Uri对应的ContentProvider中where提交匹配的数据。
  • update(Uri uri ,ContentValues values ,String where ,String[]
    selectionArgs):
    履新Uri对应的ContentProvider中where提交匹配的数目。
  • query(Uri uri ,String[] projection ,STring selection ,String[]
    selectionArgs ,String
    sortOrder):
    查询Uri对应的ContentProvider中where提交匹配的数额。

诚如的话,ContentProvider是单实例模式的,当四个应用程序通过ContentResolver来操作ContentProvider提供的数量时,ContentResolver调用的数目操作将会委托给同一个ContentProvider处理。

01   将来的拔取增多

ContentProvider与ContentResolver的关系

从ContentResolver、ContentProvider和Uri的涉嫌来看,无论是ContentResolver,依然ContentProvider,它们所提供的增删改查方法的第一个参数都是Uri。也就是说,Uri是ContentProvider和ContentResolver进行数据互换的标识。ContentResolver对点名Uri执行增删改查的数量操作,但Uri并不是真的的数量主导,由此这个增删改查操作会委托给该Uri对应的ContentProvider来实现。

ContentProvider、Uri、ContentResolver三者之间的涉及如下图所示:

0.jpg

以指定Uri为标识,ContentResolver可以兑现“直接调用”ContentProvider的增删改查方法:

  1. 当A应用调用ContentResolver的insert()方法时,实际上相当于调用了该Uri对应的ContentProvider的insert()方法。
  2. 当A应用调用ContentResolver的update()方法时,实际上相当于调用了该Uri对应的ContentProvider的update()方法。
  3. 当A应用调用ContentResolver的delete()方法时,实际上相当于调用了该Uri对应的ContentProvider的delete()方法。
  4. 当A应用调用ContentResolver的query()方法时,实际上相当于调用了该Uri对应的ContentProvider的query()方法。

认识大量新东西,可以扩展儿童以后的精选,充分孩子们的人生。然则,假若在塞满杂物的家里,是不能消除到新的信息和学识的。甚至连必要的物料都会被埋没,无法充裕发挥它们的职能。

开发ContentProvider子类

付出ContentProvider只要如下两步:

  1. 支付一个ContentProvider子类,该子类需要贯彻query()、insert()、update()和delete()等模式。
  2. 在AndroidManifest.xml文件中登记该ContentProvider,指定android:authorities属性。

只有整理收纳,家里挤出更多的空中,才会更促进激发孩子们的非凡可能!

配置ContentProvider

只要为<applicaton…/>元素添加了<provider…/>子元素即可配置ContentProvider。例如如下的部署部分:

<provider
        android:name=".FirstProvider"
        android:authorities="org.crazyit.providers.firstprovider"
        android:exported="true"/>

布置ContentProvider时常见指定如下属性:

  • name:点名该ContentProvider的贯彻类的类名。
  • authorities:点名该ContentProvider对应的Uri(相当于为该ContentProvider分配一个域名。)
  • android:exported:点名该ContentProvider是否允许任何应用调用。假使将该属性设为false,那么该ContentProvider将不允许其他使用调用。

为了确定ContentProvider实际能处理的Uri,以及确定每个方法中Uri参数所操作的数码,Android系统提供了UriMatcher工具类,重要提供了如下多少个艺术:

  • void addURI(String authority ,String path ,int
    code):
    该形式用于向UriMatcher对象注册Uri。其中authority和path组合成一个Uri,而code则代表该Uri对应的标识码。
  • int match(Uri
    uri):
    据悉前面注册的Uri来判断指定Uri对应的标识码。假诺找不到分外的标识码,就会回来-1。

Android还提供了一个ContentUris工具类,它是一个操作Uri字符串的工具类,提供了之类六个工具方法:

  • withAppendedId(uri , id):用于为路径加上ID部分。
  • parseId(uri):用以从指定Uri中剖析出所涵盖的ID值。

02   无论玩耍或上学都亟待空间

操作系统的ContentProvider

Android系统自身提供了汪洋的ContentProvider,使用ContentResolver操作系统的ContentProvider数据的步骤也是两步:

  1. 调用Context的getContentResolver()获取ContentResolver对象;
  2. 基于需要调用ContentResolver的insert()、delete()、update()和query()方法操作数据。

Android系统用于管理关系人的ContentProvider的多少个Uri如下:

  • ContactsContract.Contacts.CONTENT_URI:治本挂钩人的Uri。
  • ContactsContract.CommonDataKinds.Phone.CONTENT_URI:管制挂钩人的电话机的Uri。
  • ContactsContract.CommonDataKinds.Email.CONTENT_URI:管住关系人的E-mail的Uri。

Android为多媒体提供的ContentProvider的Uri如下所示:

  • MediaStore.Audio.Media.EXTERNAL_CONTENT_URI:仓储在外部存储其上的音频文件内容的ContentProvider的Uri。
  • MediaStore.Audio.Media.INTERNAL_CONTENT_URI:储存在手机里面存储器上的音频文件内容的ContentProvider的Uri。
  • MediaStore.Images.Media.EXTERNAL_CONTENT_URI:存储在外表存储器上的图纸文件内容的ContentProvider的Uri。
  • MediaStore.Images.Audio.Media.INTERNAL_CONTENT_URI:积存在二弟大里面存储器上的图片文件内容的ContentProvider的Uri。
  • MediaStore.Video.Media.EXTERNAL_CONTENT_URI:储存在表面存储器上的视频文件内容的ContentProvider的Uri。
  • MediaStore.Video.Audio.Media.INTERNAL_CONTENT_URI:仓储在大哥大内部存储器上的视频文件内容的ContentProvider的Uri。

首要关头是五花八门的,其中一个就是与新东西相遇的关头。举例来说,在还有空间的书架上,随时都得以摆放新的书本。所以,在四周创制出可以选取新东西的长空,不但能让娃娃每一天接触更多东西,还足以开展他们的兴趣爱好。

监听ContentProvider的多少变动

在从前的牵线中,只要导致了ContentProvider数据暴发了变动,程序中就调用如下代码:

getContext().getContentResolver(),notifyChange(uri ,null);

为了在应用程序中监听ContentProvider数据的更动,需要选拔Android提供的ContentObserver基类。监听ContentProvider数据变动的监听器需要后续ContentObserver类,相提并论写该基类所定义的onChange(boolean
selfChange)方法–当所监听的ContentProvider数据暴发变更时,该onChange()方法将会被触发。

为了监听指定ContentProvider的数目变化,需要经过ContentResolver向指定Uri注册ContentObserver监听器。ContentResolver提供了如下方法来注册监听器:

  • registerContentObserver(Uri uri , boolean notifyForDescendents ,
    ContentObserver observer)

以此艺术的几个参数分别代表:

  • uri:该监听器所监听的ContentProvider的Uri。
  • notifyForDescendents:假若该参数设为true,假设注册监听的Uri为content://abc,nameUri为contetn://abc/xyzcontent://abc/xyz/foo的多少变动时也会触发该监听器;倘使设为false,那么只有content://abc的数量发生转移时才会触发该监听器。
  • observer:监听器实例。

绘画、写作等培训创设力的玩乐,都先要有一个场地才能起头。比如,当你看书时,书桌周边尤为整齐,越容易集中精力,效率也会增高。这不只能训练孩子的专注力,同时还可能开发出意外的才干。

提供程序访问的代表格局

提供程序访问的两种替代形式在使用开发的经过中异常最首要:

  • 批量做客:可以通过ContentProviderOperation类中的方法创设一批访问调用,然后经过ContentResolver.applyBatch()执行它们。
  • 异步查询:应当在独立线程中实施查询。
  • 透过Intent访问数据:即便不能够间接向提供程序发送Intent,不过可以向提供程序的行使发送Intent,后者平常兼有修改提供程序数据的特级配置。

好的,ContentProvider就介绍这一个呢!!欢迎关注自己的微信公众号!

本身的微信公众号.jpg

03   爱惜生活周遭人、事、物的神气

整理还是能支援子女变成熟,利用这一个整理的过程,让她有机遇贴近生活。有了整理的习惯,孩子自可是然就会去想象更进一步的面貌,譬如“假使东西摆在这里不收起来,会不会妨碍到外人”“这四个高低不等的物品是不是应该分别摆更确切”……就这么,渐渐的她们就会学会为亲人、朋友等周遭的人考虑,形成关注的性格,领会关怀长辈,爱戴幼小。

04   管理物品的习惯

当新物品现身时,会先稳住收纳地点,再想想什么吸收。那样的习惯可以培养出解决问题的能力。而且,将来在攻读或办事上暴发任何问题时,这样的思维习惯也将成为应对题目标根基。其它,我们大部分人都曾因翻遍所有房间也找不到东西的动静而扎手。假若从小就养成整理的习惯,那么长大未来,就不比再受这类问题的搅扰了。

据此,不要认为你的男女还小,正因为小,才要早作育。可以从后天初步,天天花15分钟,教孩子养成优秀的盘整习惯。

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注