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)

 

 

 

 

 

 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294132.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Blazor是春天还是寒风里的挣扎

title: Blazor是春天还是寒风里的挣扎 date: 2021-10-25 14:00:00 toc: true categories:- Blazor tags:- Blazor- MASA Blazor#官方解释BlazorBlazor允许您使用c#而不是JavaScript构建交互式web UI。Blazor应用由可重用的web UI组件组成&#xff0c;这些组件使用c#、HTML和CSS…

js个人笔记

2019独角兽企业重金招聘Python工程师标准>>> 看锋利的jquery第二版&#xff0c;&#xff0c;在前言的时候说建议使用最新版jquery&#xff0c;&#xff0c;然而在第二章结尾的地方有用到toggle()这个方法&#xff0c;&#xff0c;我自己用发现和书上的功能不同&…

第二天:装饰模式及面向对象设计原则4则

装饰模式是为已有功能动态地添加更多功能的一种方式.当系统需要新功能的时候,是向旧系统中添加新的代码.这些新加的代码通常装饰了原有类的核心职责或主要行为.这样的结果等同于在主类中加入新的字段,新的方法和新的逻辑,从而增加了主类的复杂度,而这些新加入的东西仅仅是为了满…

linux ntfs 速度慢,将U盘磁盘格式改成NTFS解决u盘复制速度慢问题

1、我们首先要看看U盘的文件系统是哪个?打开计算机-可移动磁盘-右击属性。2、目前打多数U盘采用的都是FAT32格式&#xff0c;这也是大多数USB2.0船速速度比较慢的原因。我们先用文件大小测试一个它的读写速度&#xff0c;格子这里用的是一个大概四百兆的文件&#xff0c;为了让…

触发器的创建、修改和删除

一﹕ 触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约束。 二﹕ SQL Server为每个触发器都创建了两个专用表﹕Inserted表和Deleted表。这两个表由系统来维…

Android之进程与线程的讲解

安卓平台中当首次启动运行一个组件的时候&#xff0c;Android会相应的启动了一个进程。默认的&#xff0c;所有的组件和程序运行在这个进程和线程中&#xff0c;也可以安排组件在其他的进程或者线程中运行。 进程&#xff1a;组件运行的进程由manifest file控制。组件的节点 —…

如何延迟一个 Task 的执行 ?

咨询区 Bruno Lopes我想实现一个可以在延迟 Xms 后执行一个 task 的需求&#xff0c;并要求能够实现在 xms 之前取消 task 的执行&#xff0c;我的参考代码如下&#xff1a;var _cancelationTokenSource new CancellationTokenSource();var token _cancelationTokenSource.To…

Xamarin.Android和UWP之MVVM的简单使用(二)

0x01 前言 前面一篇&#xff0c;Xamarin.Android和UWP之MVVM的简单使用(一)&#xff0c;主要讲了MvvmLight的简单使用 这篇主要讲讲MvvmCross的简单使用&#xff0c;例子的话&#xff0c;还是和上篇的一样。直接进正题吧&#xff0c;不废话了。 0x02 简单的MVVM(mvvmcross) Dem…

ExtJs 带分页的comboBox

ExtJs 带分页的comboBox 如何得到当前第几页&#xff1f; 希望技术牛人能帮帮我&#xff0c;也可以加我扣扣【445958】&#xff0c; 交流JAVA Ext 框架等方面的技术&#xff01;转载于:https://blog.51cto.com/ajiao13/1133773

C语言关系 是行还是列,C语言行优先和列优先的问题深入分析

C语言行优先和列优先的问题深入分析摘要本文主要探讨的是“行优先”原则和“列优先”原则的问题。1. 背景首先了解“行优先”和“列优先”的知识&#xff0c;这两种方式在数学上的直观描述如下&#xff0c;给定如下矩阵&#xff1a;根据行优先的原则&#xff0c;其排序方式为根…

软件工程之个人项目--词频统计

不得不说对于菜鸟级的我&#xff0c;这是一次心酸的经历啊。。。自打接到王老师布置的这个任务&#xff08;个人项目&#xff09;之后&#xff0c;我心里一直在想着自己要用哪种语言来完成我的任务。以前多多少少写过一些程序的&#xff0c;这又想起了数据库小学期与永哥和小强…

RC4加密解密java算法

有一个项目&#xff0c;需要解析一个用户提供的rc4加密后的文件&#xff0c;特意搜索整理了一个java 版本的RC4加解密算法。 public static String HloveyRC4(String aInput,String aKey) { int[] iS new int[256]; byte[] iK new byte[256]; for (int i0;i<256;i…

史上最被低估的神级学科,看完忍不住感慨“它”也太重要了!

▲ 点击查看著名物理学家、数学家曾说&#xff1a;几何学的简洁美&#xff0c;却又是几何学之所以完美的核心存在。几何始于数学&#xff0c;但它的意义和影响却远超数学。一个个枯燥的数字和一个个简单的图形&#xff0c;却可以帮助我们解决很多问题&#xff0c;了解自然的规律…

.NET6之MiniAPI(三):Response

MiniAPI中&#xff0c;Response的返回数据有三种格式&#xff0c;IResult&#xff0c;string&#xff0c;json&#xff1a;ValueTask<string> - 这包括 string 和 Task<string>T&#xff08;任何其他类型&#xff0c;返回前端时转成json&#xff09;- 这包括 Task&…

ffmpeg speex转换为mp3或者aac

2019独角兽企业重金招聘Python工程师标准>>> 输入&#xff1a; flv格式&#xff0c;视频264编码&#xff0c;音频speex编码 -8:[rootandrew ffmpeg-3.0./ffprobe test_speex1.flv 32:ffprobe version 3.0-static32: Copyright (c) 2007-2016 the FFmpeg developers3…

python 解析器的常用options

解释器options: 1.1 –d 提供调试输出 1.2 –O 生成优化的字节码(生成.pyo文件) 1.3 –S 不导入site模块以在启动时查找python路径 1.4 –v 冗余输出(导入语句详细追踪) 1.5 –m mod 将一个模块以脚本形式运行 1.6 –Q opt 除法选项(参阅文档) 1.7 –c cmd 运行以命令行…

c语言给bmp图片加滤镜,关于BMP位图透明通道的详解制作教程, 教你输出透明的BMP位图...

我是sjmhiex啊月谢谢大家的支持 百度贴吧&#xff1a;sjmhiex吧QQ群&#xff1a;243153684BMP支持透明比较常见的方法有两种&#xff1a; 一种是32位图&#xff0c;直接就可以是透明的&#xff0c;还可以是半透明效果&#xff0c;一般都是用PNG转成的&#xff0c;或者在保存图…

QM课程02-外部功能

质量计划 对质量计划和检验计划进行基本数据的管理 物料说明 检验计划 质量检验 触发检验 具有检验计划选择和样本计算的检验处理 打印采样和检验的车间文档 记录结果和缺陷 做出使用决策并触发后续行为 质量控制 在质量级别历史的基础上的动态样本确定 使用质量控制…