Android中contentprovider详解

来源:互联网 发布:网络播放器哪个好用 编辑:程序博客网 时间:2024/06/09 20:08

Android中contentprovider详解

1.初识ContentProvider

ContentProvider是android四大组件之一。它是不同应用程序之间交换数据的标准api(前面提到各个activity之间的通讯是Intent),ContentProvider以某种uri的形式对外提供数据,允许其它应用程序对其访问或者修改数据,其它应用程序使用ContentResolver根据Uri去访问操作指定数据。

向android系统中注册ContentProvider只需在<application/>中添加如下子元素:

<providerandroid:name=".Dictprovider"                      ---指定ContentProvider类

android:authorities="org.crazyit.providers.dictprovider"--为ContentProvider指定域名

android:exported="true"/>

(Dictprovider需要继承ContentProvider基类)

 

2.初识Dictprovider的方法

应用程序对数据的操作无非就是CRUD(增删改查),所以Dictprovider提供以下方法:

public booleanonCreate()   

该方法在ContentProvider创建后会被调用,当其它应用程序第一次访问ContentProvider时,该ContentProvider会被创建出来,并立即回调该onCreate()方法。

public Uri insert(Uriuri,ContentValues values)

根据该uri插入对应的数据

public int delete(Uriuri,String selection,String[] selectionArgs)

根据该uri删除select条件所匹配的全部记录

public int update(Uriuri,ContentValues values,String selection,String[] selectionArgs)

根据该uri修改select条件所匹配的全部记录

public Cursor query(Uriuri,String[] projection,String selection,String[] selectionArgs,StringsortOrder)

根据uri查询出select条件所匹配的全部记录,其中projection就是个一个列名列表,表明只选择出指定的数据列

public String getType(Uriuri)

用于返回当前uri所代表的数据的MIME类型。如果该uri对应数据可能包括多条数据,那么MIME类型字符串应该以vnd.android.cursor.dir开头

 

3.uri简介

uri的组成就像我们平常访问的网络http://www.baidu.com/index.jsp一样。

比如该uri:content://org.crazyit.providers.dictprovider/words

对于这个uri,可分为如下三个部分:

   ->content:// :这个部分是android的ContentProvider规定的,就像上网的协议默认是http://一样

   ->org.crazyit.providers.distprovider:这个部分就是ContentProvider的域名(authority)

   ->words 资源部分,当访问者需要访问不同资源时,这个部分是动态改变的

uri还可以这样表达:

                 content://org.crazyit.providers.dictprovider/word/2(此时它要访问的资源为word/2,这意味着访问word数据中ID为2的记录的word字段)

                 content://org.crazyit.providers.dictprovider/word/2/word(此时它要访问的资源是word/2,这意味着访问word数据中ID为2的记录的word字段)

                 content://org.crazyit.providers.dictprovider/words(访问全部数据)

                 content://org.crazyit.providers.dictprovider/word/detail/(数据来源于文件、xml等。表示操作word节点下的detail节点)

uri工具类提供了parse()静态方法:将一个字符串转换成uri:Uri uri=Uri.parse("content://org.crazyit.providers.dictprovider/word/2")

 

4.使用contentResolver操作数据(一般是单实例的)

ContentProvider是暴露该应用程序的数据,那么其它应用程序则通过contentResolver操作数据。

context通过getContentResolver()来得到contentResolver对象,然后就可以调用contentResolver的方法来操作数据:

  insert(Uri uri,ContentValues values):向Uri对应的ContentProvider中插入values对应的数据

  delete(Uri uri,String where,String[]selectArgs):删除Uri对应的ContentProvider中where提交匹配的数据。

  update(Uri uri,ContentValues values,Stringwhere,String[] selectArgs):更新Uri对应的ContentProvider中where提交匹配的数据

  query(Uri uri,String[] projection,Stringselection,String[] selectionArgs,String sortOrder):查询Uri对应的ContentProvider中where提交匹配的数据

 

5.COntentResolver与ContentProvider的关系

从ContentResolver、ContentProvider和Uri的关系来看,无论是ContentResolver还是Contentprovider,它们所提供的CRUD方法的第一个参数都是Uri。也就是说,Uri是ContentResolver和ContentProvider进行数据交换的标示。ContentResolver对指定的Uri进行CRUD等操作,但Uri并不是真的数据中心,因此这些CRUD操作会委托给该Uri对应的ContentProvider来实现。比如说:假如A应用通过ContentResolver执行CRUD操作,这些CRUD操作都需要指定Uri参数,android系统就根据该uri找到对应的Contentprovider(该Contentprovider通常属于B应用),Contentprovider则负责实现CRUD方法,完成对底层数据的增删改查等操作,这样就可以让A应用访问、修改B应用的数据

 

6创建ContentProvider时的说明

前面提到contentResolver对指定的Uri进行CRUD操作,这些操作会委托给该Uri对应的Contentprovider来实现,但实际上,ContentProvider会对该Uri进行判断,为了确定该ContentProvider实际能处理的Uri,以及确定每个方法中的Uri参数所操作的数据,android系统提供了UriMatcher工具类。该类提供了如下两个方法:

     ->void addURI(String authority,Stringpath,int code):该方法用于向UriMatcher对象注册Uri。其中authority和path组合成一个Uri,而code则代表该uri对应的标识码

     ->int match(Uri uri):根据前面注册的Uri来判断指定Uri对应的标识码。如果找不到匹配的标识码,该方法将会返回-1

 

android还提供了一个ContentUris工具类,可操作Uri

 ->withAppendedld(uri,id)用于为路径加上ID部分

 

7.监听ContentProvider

在有些时候,应用程序需要实时监听所共享数据的改变,并随着ContentProvider共享数据的改变而做出响应,这时就需要用到ContentObserver。监听ContentProvider数据改变的监听需要继承ContentProvider类,并重写该基类所定义的onChange(booleanselfChange)方法-当它所监听的ContentProvider的数据发生改变时,该onChange会被触发

  为了监听指定ContentProvider数据变化,需要通过ContentResolver向指定Uri注册ContentObserve监听器。ContentResolver提供以下方法来注册监听器:

     registerContentObserver(Uri uri,booleannotifyForDescendents,contentObserver observer)

 ->uri :该监听器所监听的ContentProvider的uri

 ->notifiForDescendents :如果该参数设为true,假如注册监听的uri为content://abc,那么uri为content://abc/xyz\content://abc/xyz/foo的数据改变时,也会触发该监听器;反之则只有content://abc的数据发生变化时才会触发监听器

  ->observer :监听器实例

例如:getContentResolver().registerContentObserver(Uri.parse("content://sms",true,newSmsObserver(new Handler())))

原创粉丝点击