Android四大组件之ContentProvider

Android四大组件之ContentProvider

为了在应用程序之间交流数据,Android提供了ContentProvider,它是分裂应用程序之间开展数据交换的正式API,当三个应用程序须求把温馨的数目揭穿给任何程序选拔时,该应用程序就可通过提供ContentProvider来实现;别的应用程序就可经过ContentResolver来操作ContentResolver暴光的数额。

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/先河。

Uri简介

ContentProvider须求的Uri与网络的ULX570L类似,比方如下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

本文由明仕msyz手机版发布于家居装修-蜗牛装饰,转载请注明出处:Android四大组件之ContentProvider

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。