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

ContentProvider是android应用中的四大组件之一,使用时需要在AndroidManifest.xml文件中进行配置。

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

ContentProvider是不同应用程序之间进行数据交换的标准API,ContentProvider以某种Uri的形式对外提供数据,允许其他的应用访问或者修改数据。其他的应用程序使用ContentResolver根据Uri去访问操作指定的数据。

开发一个ContentProvider的步骤:

1、定义自己的ContentProvider类,该类要继承android提供的ContentProvider基类

2、在AndroidManifest.xml清单文件中对ContentProvider进行注册

 <provider android:name=".TestProvider" android:authorities="com.test.testProvider"/>

自定义的ContentProvider类继承android中提供的ContentProvider基类后还需要实现下面几个方法才能实现对外暴露数据:

onCreate() :该方法在ContentProvider创建后被调用,,当其他的应用程序第一次访问ContentProvider时,该contentProvider会被创建出来,并立即调用该onCreate()方法。适合做初始化。

query(Uri uri, String[] projection, String selection,    String[] selectionArgs, String sortOrder) :根据Uri查询满足selection条件的数据,其中projection是列名列表,表明只选择指定的数据列。

getType(Uri uri):返回Uri多代表的数据的MIME类型。如果Uri对应的数据包括多条记录,那么MIME类型的字符串应该返回以vnd.android.cursor.dir/开头,如果是一条数据那么返回的MIME字符串应该以vnd.android.cursor.item/开头

insert(Uri uri, ContentValues values) :根据Uri插入values对应的额数据

delete(Uri uri, String selection, String[] selectionArgs) :根据Uri删除和selection条件匹配的数据

update(Uri uri, ContentValues values, String selection,    String[] selectionArgs) :根据Uri更新匹配条件的数据

Uri介绍

android中的Uri:

content://com.test.testProvider/words

Uri分为三部分:

content:// : 这个部分是android所规定的的,是固定写法。

com.test.testProvider :这个部分是ContentProvider的authorities(),系统就是由这个部分找到需要操作那个ContentProvider。只要访问指定的ContentProvider,这个部分是固定的。

words:资源部分,当访问不同的资源时,这个部分是动态改变的。

android中Uri的丰富功能:

content://com.test.testProvider/word/2

此时他要访问的资源为word/2,代表访问word数据中ID为2的记录

content://com.test.testProvider/word/2/word

此时他要访问的资源为word/2,这意味着访问word数据中ID为2的记录的word字段

content://com.test.testProvider/words   //访问全部的数据

数据为XML格式的Uri

content://com.test.testProvider/word/detail/

代表访问word节点下的detail节点

android中将字符串转化为Uri的工具类Uri:

Uri uri = Uri.parse("content://com.test.testProvider/word/2/word"); 

ContentResolver操作数据:

Context提供了如下的方法来获取ContentResolver对象:getContentResolver()

ContentResolver提供如下的方法操作数据:

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

delete(Uri url, String where, String[] selectionArgs):删除Uri对应的ContentProvider中匹配where条件的数据

update(Uri uri, ContentValues values, String where, String[] selectionArgs):更新Uri对应的ContentProvider中where条件匹配的数据

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

一般来说ContentProvider是单例模式的,当多个应用程序通过ConentResolver来操作ContentProvider提供的数据时,ConentResolver调用的数据操作都将会委托给同一个ContentProvider处理。

为了确定ContentProvider实际能匹配的Uri,以及确定每个方法中Uri参数所操作的数据,android中提供了UriMatcher工具类:

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

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

UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
matcher.addURI("com.test.testProvider", "words", 1);
matcher.addURI("com.test.testProvider", "word/#", 2);

上面的#位通配符

// 返回1
matcher.match(Uri.parse("content://com.test.testProvider/words"));
// 返回2
matcher.match(Uri.parse("content://com.test.testProvider/word/2"));
// 返回2
matcher.match(Uri.parse("content://com.test.testProvider/word/22"));

android中还提供了一个ContentUris工具类,用于操作Uri字符串:

Uri withAppendedId(Uri contentUri, long id):添加id部分

parseId(Uri contentUri):解析出包含id

监听ContentProvider的数据变化:

ContentObserver:当ContentProvider中的数据改变时调用如下的代码

getContext().getContentResolver().notifyChange(uri, null);

这行代码用于通知所有注册在该Uri上的监听者:该ContentProvider所共享的数据发生了改变

为了监听ContentProvider数据的改变,需要利用android中提供的ContentObserver基类。监听ContentProvider数据改变的监听器需要继承ContentObserver类,并重写该基类所定义的onChange(boolean selfChange)方法——当他所监听的ContentProvider的数据发生改变时,该onChange将会被调用。为了监听ContentProvider的数据变化,需要通过ContentResolver向指定的Uri注册ContentObserver监听器。ContentResolver提供如下的方法来注册监听器:

registerContentObserver(Uri uri, boolean notifyForDescendents,ContentObserver observer)

uri:该监听器所监听的ContentProvider的Uri
notifyForDescendents:如果该参数为true,假如监听的Uri为content://abc,那么Uri为content://abc/xyz、content://abc/xyz/foo的数据改变也会触发该监听器,如果为false,那么只有Uri为content://abc的数据发生了变化才会触发该监听器。

getContentResolver().registerContentObserver(uri, notifyForDescendents, observer)

转载于:https://www.cnblogs.com/heml/p/3569452.html

android中的ContentProvider实现数据共享相关推荐

  1. Android中使用ContentProvider进行跨进程方法调用

    原文同一时候发表在我的博客 点我进入还能看到很多其它 需求背景 近期接到这样一个需求,须要和别的 App 进行联动交互,比方下载器 App 和桌面 App 进行联动.桌面的 App 能直接显示下载器 ...

  2. Android 中ContentProvider和Uri详解

    一.使用ContentProvider(内容提供者)共享数据 ContentProvider在android中的作用是对外共享数据,也就是说你可以通过ContentProvider把应用中的数据共享给 ...

  3. 【Android】Android中ContentProvider组件详解

    原文来自:http://blog.csdn.net/zuolongsnail/article/details/6566317 ContentProvider(内容提供者)是Android中的四大组件之 ...

  4. android content item,Android中ContentProvider的应用实例

    一.ContentProvider简介 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据,但数据访问方 ...

  5. Android中ContentProvider组件详解

    一.Android四大组件 Android四大组件是Activity, Service, Content Provider,Broadcast Receiver. Activity作为程序界面,直接与 ...

  6. Android中的跨进程通信方法实例及特点分析(二):ContentProvider

    1.ContentProvider简单介绍 在Android中有些数据(如通讯录.音频.视频文件等)是要供非常多应用程序使用的.为了更好地对外提供数据,Android系统给我们提供了Content P ...

  7. Android中个人推崇的数据库使用方式

    手机应用开发中常常会使用到数据库存储一些资料或者进行数据缓存,android中为我们提供了一个轻量的数据库.在上层进行了一层封装,同一时候还为我们提供了ContentProvider的框架.方便我们进 ...

  8. Android之自定义ContentProvider详解

    第一个版本  对android中MIME类型的理解 初始MIME类型,是在学习ContentProvider的时候. 当在创建自己的ContentProvider的时,需要从抽象类ContentPro ...

  9. Android中的IPC机制

    Android IPC简介 IPC是Inter-Process Communication的缩写,含义就是进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程.那么什么是进程,什么是线程,进程 ...

最新文章

  1. gdb调试caffe工程
  2. 802.11 MAC Header(MAC头)
  3. 大牛讲堂 | 邬书哲:物体检测算法的革新与传承
  4. 三大主流软件负载均衡器(LVS、Nginx、HAproxy) 与商业SLB比较
  5. FFmpeg编解码处理1-转码全流程简介
  6. 跟着书本学习CSS(2)
  7. python 读取 配置文件
  8. 牛客网暑期ACM多校训练营(第二场)D-money (dp)
  9. java Class对象返回的都是指向同一个java堆地址上的Class引用
  10. 昨天7月21号,笑笑又生病了
  11. .net知识和学习方法系列(二十)CLR-委托
  12. bootstrap与jQuery结合的动态进度条
  13. 2018年5大微服务发展趋势
  14. activiti 工作流_JAVA-工作流引擎-activiti-Tasks-userTask动态绑定用户或用户组
  15. CString,string,char*之间的转换
  16. 深入理解JAVA虚拟机大全
  17. MAC删除自带ABC输入法
  18. 【C语言】 C 语言 关键字分析 ( 属性关键字 | 常量关键字 | 结构体关键字 | 联合体关键字 | 枚举关键字 | 命名关键字 | 杂项关键字)
  19. cocos2dx 通用性能优化方案
  20. 一起来学Kotlin:概念:7. Kotlin 函数介绍:扩展函数,中缀函数,运算符函数,带有varrag输入的函数

热门文章

  1. 使用ETag识别ajax,如何使用jQuery AJAX请求访问ETag头?
  2. GitHub上13个学习资源项目,值得收藏!
  3. FileZilla搭建FTP服务器图解教程
  4. 计算机系统基础:文件的存取和存储空间管理知识笔记
  5. 数据结构基础:树结构的学习笔记
  6. 汇总jQuery的61种选择器及示例
  7. php动态添加查询,php动态添加url查询参数的方法,php动态url参数_PHP教程
  8. python车牌识别逆光怎么办代码_这摄像头除了能逆光识别车牌,还会跟人打招呼?...
  9. an导入html5,H5-FLASH:AN HTML5-BASED FLASH RUNTIME
  10. STM32F103ZET6 蜂鸣器、按键