[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的数据存储-SQLite-ContentProvider-preferences
个人整理的Android Intent的使用介绍 Android 组件之间的信使Intent Android 中的数据存取和ContentProvider
android-关于ContentProvider的使用例子 有详细注释
1、Android Room操作SQLite数据 2、ContentProvider使用,使用Room进行数据库操作
1.什么是内容提供者 2.说说如何创建自己应用的内容提供者 & 使用场景 3.说说ContentProvider的原理 4.ContentProvider,Co
Android---获取手机联系人
此demo利用ContentProvider实现android app间的数据共享
Android学习ContentProvider数据更新与Observer模式一Observer模式意图: 定义对象之间一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被更新。 依赖(Dependents)、发布-...
Android ContentProvider简单实现
NULL 博文链接:https://fuchangle.iteye.com/blog/1842305
Android中ContentProvider的示例,详细可以参见博客:http://www.cnblogs.com/plokmju/p/android_ContentProvider.html
Android知识点ContentProvider篇
android contentprovider使用示例
Android高级编程雪梨作业之自定义ContentProvider 将任务01生词本作业中生成的生词本数据库通过自定义ContentProvider的方式,共享给其他应用。 要求如下: (1) 使用自定义SQLiteOpenHelper来管理数据库; (2) 提交...
Android自学笔记-12-ContentProvider简单例子 contentprovider代码
ContentProvider 实例,实现ContentProvider,从其他应用访问ContentProvider数据,实现资源共享
077集-ContentProvider(1)视频教程,个人感觉还可以,共享给大家。
ContentProvider数据共享的基本使用方法
The Fastest Way to create a sql based ContentProvider in Android using annotations (No reflection) HOW TO ADD TO YOUR PROJECT Gradle: add the apt plugin as a dependency to your root build gradle as ...
filecraft-contentprovider-介绍FileCraft ContentProvider 示例 Android 应用程序。 在 Google Play 商店中与 FileCraft 一起使用。 这是示例插件应用程序的早期版本。 随着我更多地测试和使用它,事情可能会发生...