注册ContentProvider时须要为它绑定一个Uri,ContentResolver只是提供数据的走访接口

ContentResolver只是提供数据的访问接口,//authority/数据部分

Android四大组件之ContentProvider

为了在应用程序之间互换数据,Android提供了ContentProvider,它是不相同应用程序之间举办数据交换的正式API,当一个应用程序必要把本身的多少暴光给其余程序选用时,该应用程序就可透过提供ContentProvider来达成;其他应用程序就可由此ContentResolver来操作ContentResolver暴光的数据。

  1. ContentProvider:不相同应用之间举行数据交换的正规化API,当一个应用程序要把自个儿的多寡暴露给此外使用时,就可以因而ContentProvider来落成,其他应用程序通过ContentResolver操作ContentProvider暴漏的数量
  2. 应用程序通过ContentProvider揭穿了祥和的多寡操作接口,那么不论选取是不是启动,其他应用都得以透过该接口来操作该应用程序的里边数据

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/先导。
  1. ContentProvider以某种Uri的花样对外提供数据,开发ContentProvider的步骤:

Uri简介

ContentProvider须要的Uri与互连网的UOdysseyL类似,例如如下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")

概念自身的ContentProvider类,继承自Android提供的ContentProvider基类

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处理。

向Android系统登记,约等于在AndroidManifest.xml中登记,注册ContentProvider时需求为它绑定一个Uri,并制定authorities属性,注意name值中有点,exported表示是不是允许其余应用调用

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()方法。

<Provider android:name=”.DictProvider”
android:authorities=”org.crazyit.providers.dictprovider”  
android:exported=”true” />

开发ContentProvider子类

支付ContentProvider只要如下两步:

  1. 支付一个ContentProvider子类,该子类必要完成query()、insert()、update()和delete()等办法。
  2. 在AndroidManifest.xml文件中登记该ContentProvider,指定android:authorities属性。

DictProvider还需兑现如下的措施:

配置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值。
  • onCreate:其他应用程序第两次访问ContentProvider时,该ContentProvider会被成立出来,并立时调用onCreate方
  • Uri
    insert(Uri,ContentValues)方法:依照该Uri插入ContentValues对应的数量
  • int
    delete(Uri,String,String[])方法:依照Uri删除select条件所匹配的全体记录
  • int
    update(Uri,ContentValues,String,String[])方法:依据Uri修改满意selection条件所匹配的拥有记录
  • Cursor
    query(Uri,String[],String,String[],String):恩局Uri查询出满意select条件所匹配的一体记下,其中projection就是一个列名列表,申明只采取出指定的列
  • String
    getType(Uri):重返当前Uri所代表的数码的MIME类型,假设Uri对应数据包含多条记下,那么MIME类型字符串应该是以vnd.android.cursor.dir 起先,借使只对应一条记下,那么重临的MIME类型字符串应该以vnd.android.cursor.item发轫

操作系统的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
Uri的格式:content://authority/数据部分,autority类似于Url中域名的功效,数据部分是可变的,前边是一定的格式,要留意数据部分的分解,因为一个ContentProvider大概提供四个Uri
对应不同数量的走访,但content://authority部分不变

监听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:监听器实例。

 数据的仓储系统可以由开发人士任意支配,一般来讲,大多数的Content
Provider都通过Android的公文存储系统或SQLite
数据库建立和谐的数据存储系统。

提供程序访问的替代格局

提供程序访问的二种替代方式在选择开发的历程中这么些重中之重:

  • 批量拜访:可以通过ContentProviderOperation类中的方法创建一批访问调用,然后经过ContentResolver.applyBatch()执行它们。
  • 异步查询:应当在单独线程中履行查询。
  • 由此Intent访问数据:固然无法直接向提供程序发送Intent,但是足以向提供程序的选取发送Intent,后者平日拥有修改提供程序数据的一流配置。

好的,ContentProvider就介绍那些吗!!欢迎关心本身的微信公众号!

自个儿的微信公众号.jpg

系统Uri示例:

  • content://media/internal/images:重回设备上囤积的所有图片
  • content://contacts/people:再次来到设备上享有联系人信息
  • content://contacts/people/45:重回联系人消息中ID为45的维系人记录

Context提供了getContentResolver函数获取ContentResolver对象,之后方可调用它的主意,那么些办法都会转由Uri对应的ContentProvider的同名函数执行

  • insert(Uri,ContentValues):向Uri对应的ContentProvider中插入ContentValues数据
  • delete(Uri,String,String[]):删除Uri对应的ContentProvider中与原则格外的多寡
  • update(Uri,ContentValues,String,String[]):更新与规范协作的数量
  • query(Uri,String[],String,String[],String):查询与规则杰出的数额

UriMatcher工具类:

  • void addUri(String,String,int
    code):该方法用于向UriMatcher对应注册Uri,code代表Uri对应的标识码
  • int match(Uri
    uri):重回Uri的标识码,找不到重回-1

ContentUris工具类,常用语生成查询的Uri

  • withAppendedId(uri,id):用于给路径加上ID部分
  • parseId(Uri):用于从指定Uri中分析出所包含的ID值

系统一般会把ContentProvider的Uri,数据列等新闻以常量格局公开出来,方便访问

操作系统的ContentProvider

Contacts(管理关系人的应用程序)的ContentProvider提供的几个Uri:

  • ContactsContract.Contacts.CONTENT_U科雷傲I:管理挂钩人的Uri
  • ContactsContract.CommonDataKinds.Phone.CONTENT_U卡宴I:管理联系人电话的Uri
  • ContactsContract.CommonDataKinds.Email.CONTENT_URAV4I:管理挂钩人EMail的Uri

Android为多媒体提供的ContentProvider的Uri:

  • MediaStore.Audio.Media.EXTERNAL_CONTENT_URI:存储在外表存储器上的音频文件内容的ContentProvider的Uri
  • MediaStore.Audio.Media.INTERNAL_CONTENT_U君越I:存储在大哥大内部存储器上的音频文件的ContentProvider的Uri
  • MediaStore.Images.Media.EXTERNAL_CONTENT_U凯雷德I:存储在表面存储器上的图形文件内容的ContentProvider的Uri
  • MediaStore.Images.Media.INTERNAL_CONTENT_U智跑I:存储在小弟大内部存储器上的图纸内容的ContentProvider的Uri
  • MediaStore.Video.Media.EXTERNAL_CONTENT_URI
  • MediaStore.Video.Media.INTERNAL_CONTENT_UR

ContentObserver类:监听ContentProvider数据变动的监听器须要继续ContentObserver类,相提并论写
该基类所定义的onChange方法,当监听的ContentProvider的数据发生变动时,该onChange将会被触发注册监听器要运用ContentResolver的registerContentObserver函数