移动应用开发-第7章内容提供者与内容观察者

内容提供者ContentProvider实现跨程序共享数据的功能。

7.1内容提供者概述

若应用程序之间需要共享数据,则会用到ContentProvider内容提供者。功能是在不同程序之间实现数据共享,它不仅允许一个程序访问另一程序中的数据,同时还可以选择只对哪一部分数据进行共享,从而保证程序中的隐私数据不被泄露。

它是不同应用程序之间进行数据共享的标准API,如果想要访问ContentProvider中共享的数据,就一定要借助ContentResolver类,该类的实例需要通过Context中的getContent Resolver()方法获取。

程序需要使用ContentProvider暴露数据,才能被其他程序操作。其他程序必须通过ContentResolver操作该程序暴露出来的数据,而该程序会将操作结果返回给ContentResolver,然后ContentResolver再将操作结构返回给其他程序。

1,数据模型:ContentProvider使用基于数据库模型的简单表格来提供需要共享的数据。

如果要查询,则需要知道各个字段对应的数据类型。Cursor对象提供了getInt(),getString(),getLong()等方法。

2,Uri:ContentResolver中的增,删,改,查方法是以Uri的形式对外提供数据的。Uri为ContentProvider中的数据建立了唯一标识符。Uri主要由三部分组成,分别是scheme,anthority和path。scheme是以content://开头的前缀,表示操作的数据被ContentProvider控制,不会被修改。anthority表示为ContentProvider设置的唯一标识,它用来区分不同的应用程序,一般用程序包名方式命令以避免产生冲突。path表示资源或数据,当访问者需要操作不同的数据时,该部分可以动态修改。

7.2创建内容提供者

首先要创建一个类继承抽象类ContentProvider,接着重写该类中的onCreate(),getType(),insert(),delete(),update(),query()方法。其中onCreate是在创建内容提供者调用的。insert(),delete(),update(),query()方法分别用于根据指定Uri对数据进行增,删,改,查操作。getType()用于返回MIME类型的数据。

7.3访问其他应用程序

步骤:①通过pause()方法解析Uri。

②遍过query()方法查询数据。

projection:查询内容。

selection:查询条件。

selectionArgs:替换掉参数selection中的?。

③通过while()循环语句遍历查询到的数据。

可以调用Cursor对象的close()方法来关闭Cursor释放资源。

7.4内容观察者

使用内容观察者ContentObserver可以实时监听ContentProvider共享的数据是否发生变化。

7.4.1什么是内容观察者

它用于观察指定Uri代表的数据的变化,当ContentObserVer观察到指定Uri代表的数据发生变化时,就会触发ContentObserver的onChange()方法。此时onChange()方法中使用ContentResovler可以查询到变化的数据。

使用ContentObserver观察程序的数据时,首先要在该程序的ContentProvider中调用ContentResovler的notifyChange()方法。调用此方法后,当其他程序操作该程序中的数据时,该程序会向消息中心发送数据变化的消息,此时另一个程序会观察到消息中心的数据有变化,会触发ContentObserver的onChange()方法。

通过onChange观察步骤:

①创建内容观察者:MyObserver,重写父类构造方法与onChange()方法。

②注册内容观察者:先用getContentResovler()获取对象。再用registerContentObserver()方法来注册创建内容观察者。

③取消注册内容观察者:用unregisterContentObserver()方法取消注册,通常在onDestroy()方法中进行。

相关推荐
神仙别闹15 分钟前
基于java的改良版超级玛丽小游戏
java
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭39 分钟前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫1 小时前
泛型(2)
java
超爱吃士力架1 小时前
邀请逻辑
java·linux·后端
南宫生1 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石1 小时前
12/21java基础
java
拭心1 小时前
Google 提供的 Android 端上大模型组件:MediaPipe LLM 介绍
android
李小白661 小时前
Spring MVC(上)
java·spring·mvc
GoodStudyAndDayDayUp2 小时前
IDEA能够从mapper跳转到xml的插件
xml·java·intellij-idea
装不满的克莱因瓶2 小时前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb