android中的ContentProvider实现数据共享
为了在应用程序之间交换数据,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)
android中的ContentProvider实现数据共享的更多相关文章
- Android中使用ContentProvider进行跨进程方法调用
原文同一时候发表在我的博客 点我进入还能看到很多其它 需求背景 近期接到这样一个需求,须要和别的 App 进行联动交互,比方下载器 App 和桌面 App 进行联动.桌面的 App 能直接显示下载器 ...
- Android中应用contentprovider来创建数据库的一些步骤
http://blog.csdn.net/xiaodongvtion/article/details/7865669 1:首先创建一个xxprovider的class,它是extendscontent ...
- android四大组件--ContentProvider具体解释
一.相关ContentProvider概念解析: 1.ContentProvider简单介绍 在Android官方指出的Android的数据存储方式总共同拥有五种,各自是:Shared Prefere ...
- 【转】android四大组件--ContentProvider详解
一.相关ContentProvider概念解析: 1.ContentProvider简介在Android官方指出的Android的数据存储方式总共有五种,分别是:Shared Preferences. ...
- Android四大组件--ContentProvider详解(转)
一.相关ContentProvider概念解析: 1.ContentProvider简介在Android官方指出的Android的数据存储方式总共有五种,分别是:Shared Preferences. ...
- Android中内容提供者ContentProvider的详解
1.什么是ContentProvider 首先,ContentProvider(内容提供者)是android中的四大组件之一,但是在一般的开发中,可能使用的比较少. ContentProvider为不 ...
- Android中数据存储(四)——ContentProvider存储数据
目录(?)[+] 当一个应用程序在Android中安装后,我们在使用应用的过程中会产生很多的数据,应用都有自己的数据,那么我们应该如何存储数据呢? 数据存储方式 Android 的数据存储有5种方 ...
- Android中的跨进程通信方法实例及特点分析(二):ContentProvider
1.ContentProvider简单介绍 在Android中有些数据(如通讯录.音频.视频文件等)是要供非常多应用程序使用的.为了更好地对外提供数据.Android系统给我们提供了Content P ...
- Android学习记录(3)—Android中ContentProvider的基本原理学习总结
一.ContentProvider简介 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据 ...
随机推荐
- python基础----以面向对象的思想编写游戏技能系统
1. 许多程序员对面向对象的思想都很了解,并且也能说得头头是道,但是在工作运用中却用的并不顺手. 当然,我也是其中之一. 不过最近我听了我们老师的讲课,对于面向对象的思想有了更深的理解,今天决定用一个 ...
- Android中shape的使用方法总结
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http ...
- 【笔记目录2】【jessetalk 】ASP.NET Core快速入门_学习笔记汇总
当前标签: ASP.NET Core快速入门 共2页: 上一页 1 2 任务27:Middleware管道介绍 GASA 2019-02-12 20:07 阅读:15 评论:0 任务26:dotne ...
- vue证明题二,让vue跑起来
使用vue有很多连带产品,大多数入门的并非看不懂官方文档,也并非不会语法,而是卡在这些连带产品上 笔者刚刚入手这台电脑,什么都没装,就以此开始,从头构建一个vue项目吧,哪怕没有任何基础,跟着来应该是 ...
- picker多级选择器的使用————小程序
picker多级选择器的使用----小程序 picker是选择器来着,既然选择了,就希望可以获取选择的数据. index.html <view>picker获取数据</view> ...
- 2019-8-31-Latex-公式速查
title author date CreateTime categories Latex 公式速查 lindexi 2019-08-31 16:55:58 +0800 2018-05-25 16:5 ...
- 【week8 in ricoh】 Learning CNN
week8:5.27 1.做CNN practical[1]里的example1,了解CNN模块中的每一个部分 (1)卷积层的卷积过程,输入输出维度变化(2)ReLU(3)Pooling层(4)Nor ...
- 使用CSS3的@media来编写响应式的页面
首先要知道,我们为什么要写自适应的页面(响应式页面) [直接看干货] 众所周知,电脑.平板.手机的屏幕是差距很大的,假如在电脑上写好了一个页面,在电脑上看起来不错,但是如果放到手机上的话,那可能就会乱 ...
- iview select下拉框的蜜汁小坑
前言 最近使用iview的select下拉选择器,遇到一个很神奇的问题:选中下拉框里面的一个值,但是再去点下拉框的时候就只剩刚才选中的数据了.感觉应该是插件把刚才选中的数据当做的搜索条件,所以需要做的 ...
- 初识sed和gwak
一.sed编辑器 sed命令的格式如下: sed options script file 选项 -e script 在处理输入时,将script中指定的命令添加到已有的命令中 -f fi ...