Android四大组件之ContentProvider

时间:2019-10-26 05:19来源:永利澳门游戏网站
Android四大组件之ContentProvider 为了在应用程序之间沟通数据,Android提供了ContentProvider,它是众口难调应用程序之间开展数据交流的职业API,当一个应用程序须要把温馨的数据揭穿给其余

Android四大组件之ContentProvider

为了在应用程序之间沟通数据,Android提供了ContentProvider,它是众口难调应用程序之间开展数据交流的职业API,当一个应用程序须要把温馨的数据揭穿给其余程序行使时,该应用程序就可透过提供ContentProvider来完毕;其余应用程序就可因此ContentResolver来操作ContentResolver暴光的数码。

ContentProvider简介

ContentProvider是不相同应用程序之间开展数据沟通的标准API,ContentProvider以某种Uri的样式对外提供数据,允许其余使用访问或校勘数据;其余应用程序使用COntentResolver依据Uri去访问操作内定数量。

只要有个别应用程序通过COntentProvider揭破了温馨的数码操作接口,那么不管该应用程序是不是运转,其余应用程序都可由此该接口来操作该应用程序的在那之中数据,包涵扩展数量、删除数据、改善数据、查询数据等。

Android四大组件之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[]Android四大组件之ContentProvider。 selectionArgs):听他们说Uri纠正selection条件所匹配的漫天记录。
  • public Cursor query(Uri uri ,String[]Android四大组件之ContentProvider。 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/开端。

Uri简介

Android四大组件之ContentProvider。ContentProvider要求的Uri与网络的ULacrosseL近似,譬如如下Uri:

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

它能够分为如下三有的:

  • content://:这些部分是Android的ContentProvider规定的,就如上网的商量默许是
  • 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管理。

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值。

操作系统的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/xyz、content://abc/xyz/foo的多少变动时也会触发该监听器;假设设为false,那么唯有content://abc的数量发生变动时才会触发该监听器。
  • observer:监听器实例。

提供程序访谈的代表方式

提供程序访谈的三种替代格局在采取开采的经过中十一分要害:

  • 批量访谈:能够通过ContentProviderOperation类中的方法创制一堆访问调用,然后通过ContentResolver.applyBatch()试行它们。
  • 异步查询:相应在独立线程中实行查询。
  • 经过Intent访谈数据:尽管不恐怕直接向提供程序发送Intent,不过足以向提供程序的行使发送Intent,前者平日兼有改进提供程序数据的精品配置。

好的,ContentProvider就介绍这一个呢!!接待关切本人的微教徒人号!

本身的微信民众号.jpg

编辑:永利澳门游戏网站 本文来源:Android四大组件之ContentProvider

关键词: