必威电竞外围网站Android四不胜组件的ContentProvider,Content

Android四老大组件的ContentProvider

为在应用程序之间交流数据,Android提供了ContentProvider,它是不同应用程序之间展开数据交换的正规API,当一个应用程序需要把团结之数透露被此外程序下时,该应用程序就可因而提供ContentProvider来实现;其他应用程序就只是通过ContentResolver来操作ContentResolver显露的多少。

    
ContentProvider(内容提供者)是Android中之季死组件有。紧要用以对外共享数据,也不怕是由此ContentProvider把下中的多寡共享为其余应用访问,其他以可经过ContentProvider对点名应用被的数量开展操作。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/初叶。

   
内容提供者将部分特定的应用程序数据供给此外应用程序使用。数据可以储存于文件系统、SQLite数据库或另方法。内容提供者继承给
ContentProvider
基类,为任何应用程序取用和仓储它们管理之数码实现了扳平学标准方法。但是,应用程序并无直调用那个方法,而是下一个
ContentResolver
对象,调用它的道作为替代。ContentResolver可以跟自由内容提供者举行对话,与这搭档来对拥有有关交互通讯举办管制。

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")

1.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提供了部分第一数据类的ContentProvider,比如音频、视频、图片与亲信通讯录等。可当android.provider包下边找到有Android提供的ContentProvider。通过取得这多少个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属性。

public boolean onCreate()
在创建ContentProvider时调用

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

public Cursor query(Uri, String[], String,
String[], String)
用于查询指定Uri的ContentProvider,重回一个Cursor

操作系统的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。

public Uri insert(Uri, ContentValues)
用于添加数据到指定Uri的ContentProvider中

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

public int update(Uri, ContentValues, String,
String[]) 用于改进指定Uri的ContentProvider中的数量

供程序访问的代形式

提供程序访问的老三栽替代形式以拔取开发的历程被那一个要:

  • 批量访问:好经ContentProviderOperation类中的法成立同批访问调用,然后通过ContentResolver.applyBatch()执行其。
  • 异步查询:应以单身线程中施行查询。
  • 因此Intent访问数:尽管无法直接通往提供次发送Intent,可是好为提供程序的使发送Intent,后者平日有修改提供次数据的一级配置。

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

我的微信公众号.jpg

public int delete(Uri, String, String[])
用于打指定Uri的ContentProvider中除去数据

public String getType(Uri)
用于重回指定的Uri中的数额的MIME类型

*即便操作的多寡属于集合类型,那么MIME类型字符串应该因vnd.android.cursor.dir/初叶。

譬如:要得到有person记录之Uri为content://contacts/person,那么回的MIME类型字符串为”vnd.android.cursor.dir/person”。

*而一旦操作的数据属于非集合类型数据,那么MIME类型字符串应该因为vnd.android.cursor.item/伊始。

譬如:要博id为10的person记录的Uri为content://contacts/person/10,那么回的MIME类型字符串应为”vnd.android.cursor.item/person”。

2.ContentResolver

当外部应用得对ContentProvider中之数目举办添加、删除、修改及询问操作时,能够采用ContentResolver类来就,要博取ContentResolver对象,可以应用Context提供的getContentResolver()方法。

ContentResolver提供的法子和ContentProvider提供的办法对应之发以下几独艺术。

public Uri insert(Uri uri, ContentValues values)
用于添加数据及指定Uri的ContentProvider中。

public int delete(Uri uri, String selection, String[]
selectionArgs) 用于打指定Uri的ContentProvider中删除数据。

public int update(Uri uri, ContentValues values, String
selection, String[] selectionArgs)
用于更新指定Uri的ContentProvider中之数码。

public Cursor query(Uri uri, String[] projection,
String selection, String[] selectionArgs, String sortOrder)
用于查询指定Uri的ContentProvider。

3.Uri

Uri指定了将操作的ContentProvider,其实可以将一个Uri看作是一个网址,大家管Uri分为三有。

率先片凡”content://”。可以作为是网址中之”http://"。

第二有的凡是主机名或authority,用于唯一标识是ContentProvider,外部应用得基于这一个标识来找到它们。可以当做是网址中之主机名,比如”blog.csdn.net”。

老三部分凡程径名,用来代表将要操作的数目。可以看做网址中分的始末路径。

 

常用之系URI

   
访问系统提供的另数据格局基本接近,只是传入的URI有所区别,这个URI都是API里面提供的,通过系统确定的差URI可访问系统不同之多少。系统常用之URI如下:

关系人的URI:
ContactsContract.Contacts.CONTENT_URI 管理挂钩人之Uri

ContactsContract.CommonDataKinds.Phone.CONTENT_URI
管理挂钩人之电话的Uri

ContactsContract.CommonDataKinds.Email.CONTENT_URI
管理挂钩人之Email的Uri

(注:Contacts有少数单表明,分别是rawContact和Data,rawContact记录了用户的id和name,

其中id栏名称
为:ContactsContract.Contacts._ID,name名称栏为ContactContract.Contracts.DISPLAY_NAME,

对讲机消息表的外键id为
ContactsContract.CommonDataKinds.Phone.CONTACT_ID,

电话号码栏名称为:ContactsContract.CommonDataKinds.Phone.NUMBER。

data表中Email地址栏名称为:ContactsContract.CommonDataKinds.Email.DATA
其二外键栏为:ContactsContract.CommonDataKinds.Email.CONTACT_ID)

多媒体的ContentProvider的Uri如下:
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI  存储于sd卡上的音频文件
MediaStore.Audio.Media.INTERNAL_CONTENT_URI
 存储于大哥大内存储器上的音频文件

MediaStore.Audio.Images.EXTERNAL_CONTENT_URI
SD卡上之图文件内容
MediaStore.Audio.Images.INTERNAL_CONTENT_URI 手机内部存储器上之图样
MediaStore.Audio.Video.EXTERNAL_CONTENT_URI SD卡上之视频
MediaStore.Audio.Video.INTERNAL_CONTENT_URI
 手机中存储器上的视频

(注:图片的彰显名栏:Media.DISPLAY_NAME,图片的详细描述栏为:Media.DESCRIPTION
 图片的保留地点:Media.DATA

短信URI:Content://sms

发送箱中之缺少信URI:Content://sms/outbox

相关文章

admin

网站地图xml地图