>

ContentResolver只是提供数据的访问接口

- 编辑:新浦京澳门赌 -

ContentResolver只是提供数据的访问接口

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[]ContentResolver只是提供数据的访问接口。 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/起始。

ContentResolver只是提供数据的访问接口。Uri简介

ContentProvider须求的Uri与互连网的UXC60L相似,比如如下Uri:

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

它能够分为如下三部分:

  • content://:那几个部分是Android的ContentProvider规定的,就像上网的磋商默许是
  • org.crazyit.providers.dictprovider:这几个部分就是COntentProvider的authorities。系统正是由那些有个别来找到操作哪个ContentProvider的。只要访谈钦定的ContentProvider,那么些片段正是定位的,
  • words:能源部分(大概说数据部分)。当媒体人需求拜访分化能源时,这几个部分是动态改动的。

ContentResolver只是提供数据的访问接口。为了将多个字符串调换来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(卡塔尔(英语:State of Qatar)方法时,实际上相当于调用了该Uri对应的ContentProvider的insert(卡塔尔(英语:State of Qatar)方法。
  2. 当A应用调用ContentResolver的update(卡塔尔国方法时,实际上也就是调用了该Uri对应的ContentProvider的update(卡塔尔(英语:State of Qatar)方法。
  3. 当A应用调用ContentResolver的delete(卡塔尔(قطر‎方法时,实际上约等于调用了该Uri对应的ContentProvider的delete(卡塔尔(英语:State of Qatar)方法。
  4. 当A应用调用ContentResolver的query(卡塔尔方法时,实际上约等于调用了该Uri对应的ContentProvider的query(卡塔尔国方法。

开发ContentProvider子类

开采ContentProvider只要如下两步:

  1. 付出八个ContentProvider子类,该子类供给落到实处query(卡塔尔(英语:State of Qatar)、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(卡塔尔(英语:State of Qatar)、delete(卡塔尔(英语:State of Qatar)、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卡塔尔(英语:State of Qatar)方法--当所监听的ContentProvider数据产生转移时,该onChange(卡塔尔(英语:State of Qatar)方法将会被触发。

为了监听钦点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就介绍这么些呢!!迎接关切自己的Wechat群众号!

自己的Wechat公众号.jpg

本文由阴阳师图片高清壁纸发布,转载请注明来源:ContentResolver只是提供数据的访问接口