当前位置:首页 > 开发 > 移动开发 > 正文

android笔记--android数据存储--ContentProvider

发表于: 2011-10-25   作者:coolxing   来源:转载   浏览:
摘要: [coolxing按: 转载请注明作者和出处, 如有谬误, 欢迎在评论中指正.]   ContentProvider是android中不同应用程序之间进行数据交换的标准API, 当一个应用程序需要将自己的数据暴露给其他应用程序使用时, 就可以通过提供ContentProvider来实现, 其他应用程序就可以通过ContentResolver来操作ContentProvide

[coolxing按: 转载请注明作者和出处, 如有谬误, 欢迎在评论中指正.]

 

ContentProvider是android中不同应用程序之间进行数据交换的标准API, 当一个应用程序需要将自己的数据暴露给其他应用程序使用时, 就可以通过提供ContentProvider来实现, 其他应用程序就可以通过ContentResolver来操作ContentProvider暴露的数据.

ContentProvider是android应用的四大组件之一, 需要在AndroidManifest.xml文件中配置, 如下例:

<provider android:name=".PersonProvider" android:authorities="cn.itcast.providers.personprovider"/>

一旦某个应用程序通过ContentProvider暴露了自己的数据操作接口, 那么不管该应用是否启动, 其他应用程序都可以通过这个接口来操作该应用的内部数据.

 

ContentProvider的大部分方法都涉及到了Uri, 我们需要了解什么是Uri, 怎样匹配Uri. 

Uri类. android中Uri由三部分组成--scheme, authority和path, 格式为scheme://authority/path. 其中ContentProvider的scheme为content://.

ContentProvider的authority可以在配置文件中配置<provider>元素时, 通过android:authorities属性指定. path为资源的路径.

UriMatcher类. UriMatcher 类主要用于匹配Uri. 

1, 创建实例对象. UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);  其中UriMatcher.NO_MATCH为调用int match (Uri uri)方法不存在匹配的Uri时的返回值.

2, 调用matcher的void addURI (String authority, String path, int code)方法给匹配器添加Uri, #为通配符. code参数为调用int match (Uri uri)方法匹配这个Uri时的返回值.

3, 调用int match (Uri uri)方法, 如果能够匹配返回相应的code值, 否则返回UriMatcher.NO_MATCH.

ContentUris类. ContentUris类用于解析Uri末尾处的数字或给Uri在其末尾处添加数字.

|--static long parseId (Uri contentUri): 解析出Uri路径部分的ID.

|--static Uri withAppendedId (Uri contentUri, long id): 给Uri的路径部分添加ID.

 

定义ContentProvider. 开发一个完整的ContentProvider需要自定义一个ContentProvider的子类, 并提供以下几个方法:

|--boolean onCreate (): 当该ContentProvider首次被其他应用访问时, 系统将创建ContentProvider的子类对象, 并调用其onCreate()方法.

|--Uri insert (Uri uri, ContentValues values): 插入数据操作.

|--int delete (Uri uri, String selection, String[] selectionArgs): 删除数据操作.

|--int update (Uri uri, ContentValues values, String selection, String[] selectionArgs): 更新数据操作.

|--Cursor query (Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder): 查询操作.

|--String getType (Uri uri): 返回当前Uri所代表的数据的MIME类型. 如果该Uri对应的数据可能包括多条记录,

那么MIME类型字符串应该以vnd.android.cursor.dir/开头, 如果该Uri对应的数据只包含一条记录, 则MIME类型字符串应该以vnd.android.cursor.item/开头.

 

在其他应用中使用ContentResolver操作数据. Context类提供了ContentResolver getContentResolver ()方法用以获取其ContentResolver实例.

调用ContentResolver类的增删改查方法就可以操作数据了.

 

监听ContentProvider的数据改变. 调用ContentResolver的增删改方法都可能导致ContentProvider暴露的数据发生改变, 为了实现对数据发生改变的监听,

需要:

1, 注册监听器. 调用ContentResolver类的void registerContentObserver (Uri uri, boolean notifyForDescendents, ContentObserver observer)方法即可为指定uri注册监听器. 如果notifyForDescendents为true, 假如注册监听的uri为content://abc, 那么uri为content://abc/xxx或content://abc/xxx/yyy的数据发生改变时也会触发该监听器. 如果notifyForDescendents为false, 那么只有content://abc的数据发生改变时会触发监听器.

ContentObserver类是一个抽象类, 因此需要定义一个ContentObserver类的子类, 并重写其onChange()方法, 当监听器被触发时, 回调ContentObserver子类对象的onChange()方法.

2, 当数据发生改变时发出通知. 发出通知的代码可以是getContext().getContentResolver().notifyChange(uri, null), 用以通知注册在该uri上的监听器ContentProvider所共享的数据发生了改变.

 

android笔记--android数据存储--ContentProvider

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号