翔如菲菲

其实天很蓝,阴云总会散;其实海不宽,此岸连彼岸.

导航

Android学习(八) ContentProvider

Android中,应用之间的数据共享是通过统一的接口(这里所说的接口 并非JAVA/C#语言中的那个Interface)来实现的,这个接口就是ContentProvider。ContentProvider是Android的四大组件之一(四大组件:Activity、Service、Intent、ContentProvider),应用要想共享自己的数据给其他的应用访问,那么可以派生自基类ContentProvider来实现数据的外部访问。

ContentProvider是以Uri的形式向外部提供数据的,其形式如:content://xxx.xxxxx,有点类似RESTFul,通过一个URI来确定一个资源,但是这只是其Uri表象形式,其实他比REST更为灵活,他可以接收查询过滤(Selection),结果排序(OrderBy)等,其查询结果一个Cursor。我们只需要2个步骤就可以实现自己的应用对外的ContentProvider:

  1.自定义一个ContentProvider,继承自ContentProvider,并实现相关的方法

  2.注册我们自定义的ContentProvider(在AndroidManifest.xml中注册)

ContentProvider类提供了如下常用的方法:

onCreate() :初始化ContentProvider.
query(Uri, String[], String, String[], String) :查询数据。
insert(Uri, ContentValues) :插入数据
update(Uri, ContentValues, String, String[]) :更新数据。
delete(Uri, String, String[]): 删除数据。
getType(Uri) :返回content provider的 MIME Type。
ContentProvider的Uri分为3格部分,比如content://com.jeriffe.app.customprovider/demodatas,其3格部分如下:

    1.Uri必须以content://起始

    2.com.jeriffe.app.customprovider是ContentProvider的Authority,也就是说这是那个ContentProvider。

    3.demodatas就是要访问的资源,这里是要访问com.jeriffe.app.customprovider下的demodatas列表,比如content://com.jeriffe.app.customprovider/demodata/2,这里的demodatas/2是要访问ID为2的demodata数据。

我们该如何访问ContentProvider呢,Android是通过ContentResolver类来操作ContentProvider的数据的。ContentResolver类提供了如下常用方法

query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder):查询给定的URI,返回一个Cursor对象.

insert(Uri url, ContentValues values):插入数据.

update(Uri uri, ContentValues values, String where, String[] selectionArgs):更新数据.

delete(Uri url, String where, String[] selectionArgs):删除数据.

getType(Uri url):返回给定Uri的 MIME Type。

openInputStream(Uri uri)打开一个给定Uri关联的Strea
openOutputStream(Uri uri):等同于 openOutputStream(uri, "w")
openOutputStream(Uri uri, String mode):打开一个给定Uri关联的Stream.

notifyChange(Uri uri, ContentObserver observer):ContentProvider数据发生变更时,通知注册的ContentObservers.

registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer):注册一个观察者类,当给定的Uri对应的ContentProvider数据发生变更时,发起一个回调

unregisterContentObserver(ContentObserver observer):移除注册的回调ContentObserver.

下来我们通过2格DEMO来演示:

示例1:访问系统的联系人信息

 

示例2:自定义个一个ContentProvider

posted on 2012-10-29 11:30  翔如飞飞  阅读(295)  评论(0编辑  收藏  举报