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

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

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

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

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

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

ContentProvider的authority可以在配置文件中配置元素时, 通过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所共享的数据发生了改变.