HarmonyOS开发:跨应用数据共享详解

news2024/12/26 17:43:59

目录

  • 前言
  • 跨应用数据共享的重要性
  • HarmonyOS的数据共享能力
  • 相关的基本概念
  • 跨应用数据共享的数据管理
  • 具体实现跨应用数据共享
  • 延伸:数据共享的安全和隐私
  • 结语

前言

现在的移动操作系统中,应用之间的数据共享已成为提升用户体验和实现功能互补的重要手段,尤其是在移动端开发中,关于数据存储和数据共享是重中之重的事情。而HarmonyOS作为华为推出的新一代操作系统,它提供了一套先进的跨应用数据共享机制,允许应用之间安全、高效地共享数据。在HarmonyOS开发中,根据HarmonyOS的数据共享特有优势,让HarmonyOS应用开发体验到新技术的使用快感。那么本文就来详细分享一下HarmonyOS中跨应用之间的数据共享等使用方法,以及示例案例分享,希望通过本文能够帮助更多开发者。

跨应用数据共享的重要性

先来了解一下关于跨应用数据共享,其实跨应用数据共享在实际应用中非常重要,个人觉得以下方面对于跨应用数据共享至关重要,具体如下所示:

  • 用户体验:它提供无缝衔接的体验,比如在不同应用间共享图片或文档,这都是非常实用的方面;
  • 功能互补:允许应用利用其他应用的功能或数据,实现更丰富的服务,应用之间的数据互通也很重要;
  • 效率提升:减少数据的重复输入和处理,提高操作效率,尤其是现在处于大数据时代,至关重要。

HarmonyOS的数据共享能力

根据鸿蒙官方的介绍,HarmonyOS通过以下机制支持跨应用数据共享:

  • 分布式软总线:提供设备间通信的能力,实现数据的无缝流转,它允许设备之间建立快速、稳定的连接。
  • Ability Slice:允许应用以卡片形式被其他应用调用和共享,允许应用将其部分功能或数据以卡片形式分享给其他应用;
  • 公共数据目录:在文件系统中定义公共数据存储区域,供多个应用访问,这些数据可以被具有相应权限的其他应用访问。

再来分享一下HarmonyOS的跨应用数据共享,跨应用数据共享提供了向其他应用共享以及管理其数据的方法,支持不同应用之间的数据协同。在许多应用场景中都需要用到数据共享,比如将电话簿、短信、媒体库中的数据共享给其他应用等,但不是所有的数据都允许其他应用访问,比如账号、密码等;另外,有些数据也只允许其他应用查询而不允许其删改,比如短信等。所以针对不同数据共享场景以及数据隐私保护,设计一个安全、便捷的跨应用数据共享机制是十分必要的。

相关的基本概念

在进行跨应用数据共享开发前,先来了解以下相关概念,具体如下所示:

  • 数据提供方:提供数据及实现相关业务的应用程序,也称为生产者或服务端;
  • 数据访问方:访问数据提供方所提供的数据或业务的应用程序,也称为消费者或客户端;
  • 数据集:用户要插入的数据集合,可以是一条或多条数据。数据集以键值对的形式存在,键为字符串类型,值支持数字、字符串、布尔值、无符号整型数组等多种数据类型;
  • 结果集:用户查询之后的结果集合,其提供了灵活的数据访问方式,以便用户获取各项数据;
  • 谓词:用户访问数据库中的数据所使用的筛选条件,经常被应用在更新数据、删除数据和查询数据等场景。

跨应用数据共享的数据管理

目前来看,基于跨应用数据共享中涉及的数据提供方应用个数的不同情况,数据管理提供支持一对多跨应用数据共享和多对多跨应用数据共享的能力。

1、一对多跨应用数据共享

跨应用一对多数据共享的场景,目前仅对系统应用开放,暂不具体展开提供相关内容和指导。

2、多对多跨应用数据共享

区别于一对多数据共享只有一个数据提供方,当多个应用之间需要相互进行数据共享时,即多对多的跨应用数据共享场景下,对于数据的定义、流通和权限管理等是十分必要的。统一数据管理框架(UDMF)即提供一种新的数据共享与交互方式,可以实现多对多跨应用数据共享。

具体实现跨应用数据共享

其实应用可以根据UDMF标准化数据通路提供的数据接入与读取接口,将符合标准化数据定义的数据写入UDMF不同的数据共享通路,并提供多应用进行读取。写入UDMF中的数据依据应用定义的权限、数据通路定义的权限以及整个UDMF框架定义的权限管理逻辑进行管理,写入通路中的数据的生命周期的管理也遵循上述逻辑。这样离散在各个应用的碎片化数据可以在UDMF的不同通路中形成聚合效应,提升开发者跨应用数据协同的效率,同时会极大提升用户的数据体验。

1、场景介绍

在HarmonyOS中可以通过标准化数据通路实现数据共享,这里做一个场景介绍,比如在多对多跨应用数据共享的场景下,需要提供一条数据通路能够接入多个不同应用的数据并共享给其他应用进行读取,UDMF针对多对多跨应用数据共享的不同业务场景提供了标准化的数据通路,提供了标准化的数据接入与读取接口。

2、标准化数据通路的定义和实现

先来了解一下标准化数据通路,标准化数据通路是为各种业务场景提供的跨应用的数据接入与读取通路,它可以暂存应用需要共享的符合标准化数据定义的统一数据对象,并提供给其他应用进行访问,同时按照一定的策略对暂存数据的访问权限和生命周期进行管理。标准化数据通路通过UDMF提供的系统服务实现,应用(数据提供方)需要共享公共数据时可以通过UDMF提供的插入接口将数据写入到UDMF的数据通路中,并且可以通过UDMF提供的更新和删除接口对已经存入UDMF数据通路的数据进行更新和删除操作,而且在完成必要的权限校验后,目标应用(数据访问方)可以通过UDMF提供的读取接口进行数据的访问,数据被读取后,UDMF会统一对数据的生命周期进行管理。

其实,统一数据对象UnifiedData在UDMF数据通路中具有全局唯一URI标识,其定义为udmf://intention/bundleName/groupId,其中各组成部分的含义分别为:

  • udmf: 协议名,表示使用UDMF提供的数据通路。
  • intention: UDMF已经支持的数据通路类型枚举值,对应不同的业务场景。
  • bundleName: 数据来源应用的包名称。
  • groupId:分组名称,支持批量数据分组管理。

当前UDMF中的跨应用数据共享通路有:公共数据通路。

3、公共数据通路

关于公共数据通路,其实就是应用共享的公用数据共享通路,所有应用均可向通路中写入数据,写入方可以根据写入数据时生成的数据唯一标识符进行数据的更新、删除、指定数据标识符进行查询、全量查询,而数据读取方只能读取当前数据通路中的全量数据,通路对应的Intention枚举类型为DATA_HUB。

4、标准化数据通路的相关接口

根据鸿蒙官方介绍,关于UDMF标准化数据通路的相关接口,均为异步接口,异步接口均有callback和Promise两种返回形式,下图均以callback形式为例,具体如下所示:

接口名称

描述

insertData(options: Options, data: UnifiedData, callback: AsyncCallback): void

将数据写入UDMF的公共数据通路中,并生成数据的唯一标识符,使用callback异步回调。

updateData(options: Options, data: UnifiedData, callback: AsyncCallback): void

更新已写入UDMF的公共数据通路的数据,使用callback异步回调。

queryData(options: Options, callback: AsyncCallback>): void

查询UDMF公共数据通路的数据,使用callback异步回调。

deleteData(options: Options, callback: AsyncCallback>): void

删除UDMF公共数据通路的数据,返回删除的数据集,使用callback异步回调。

5、开发步骤

由于篇幅有限,这里以一次多对多数据共享的过程为例说明开发步骤,数据提供方可以通过UMDF提供的insertData接口将数据写入公共数据通路,获取到的返回值(生成的数据的唯一标识符),可用于对其插入的数据进行更新和删除操作。数据访问方则可以通过UDMF提供的查询接口获取当前公共数据通路的全量数据。

6、数据提供方

(1)导入unifiedDataChannel和uniformTypeDescriptor模块

import { unifiedDataChannel, uniformTypeDescriptor } from '@kit.ArkData';

(2)创建一个统一数据对象并插入到UDMF的公共数据通路中

import { BusinessError } from '@kit.BasicServicesKit';
let plainText = new unifiedDataChannel.PlainText();
plainText.textContent = 'hello sanzhanggui';
let unifiedData = new unifiedDataChannel.UnifiedData(plainText);
// 要插入数据的数据通路枚举类型
let options: unifiedDataChannel.Options = {
intention: unifiedDataChannel.Intention.DATA_HUB
}
try {
unifiedDataChannel.insertData(options, unifiedData, (err, key) => {
if (err === undefined) {
console.info(Succeeded in inserting data. key = ${key});
} else {
console.error(Failed to insert data. code is ${err.code},message is ${err.message} );
}
});
} catch (e) {
let error: BusinessError = e as BusinessError;
console.error(Insert data throws an exception. code is ${error.code},message is ${error.message} );
}

(3)更新上一步,插入统一数据对象

let plainText = new unifiedDataChannel.PlainText();
plainText.textContent = 'Hi, sanzhanggui';
let unifiedData = new unifiedDataChannel.UnifiedData(plainText);
// 指定要更新的统一数据对象的URI
let options: unifiedDataChannel.Options = {
// 这里的key值要与insertData接口回调函数中key保持一致
key: 'udmf://DataHub/com.ohos.t/334'
};
try {
unifiedDataChannel.updateData(options, unifiedData, (err) => {
if (err === undefined) {
console.info('Succeeded');
} else {
console.error(Failed to update data. code is ${err.code},message is ${err.message} );
}
});
} catch (e) {
let error: BusinessError = e as BusinessError;
console.error(Update data throws an exception. code is ${error.code},message is ${error.message} );
}

(4)删除存储在UDMF公共数据通路中的统一数据对象

// 删除数据的数据通路枚举类型
let options: unifiedDataChannel.Options = {
intention: unifiedDataChannel.Intention.DATA_HUB
};
try {
unifiedDataChannel.deleteData(options, (err, data) => {
if (err === undefined) {
console.info(Succeeded = ${data.length});
for (let i = 0; i < data.length; i++) {
let records = data[i].getRecords();
for (let j = 0; j < records.length; j++) {
if (records[j].getType() === uniformTypeDescriptor.UniformDataType.PLAIN_TEXT) {
let text = records[j] as unifiedDataChannel.PlainText;
console.info(${i + 1}.${text.textContent});
}
}
}
} else {
console.error(Failed  ${err.code},message is ${err.message} );
}
});
} catch (e) {
let error: BusinessError = e as BusinessError;
console.error(Delete  ${error.code},message is ${error.message} );
}

7、数据访问方

(1)导入unifiedDataChannel和uniformTypeDescriptor模块

import { unifiedDataChannel, uniformTypeDescriptor } from '@kit.ArkData';

(2)查询存储在UDMF公共数据通路中的全量统一数据对象

import { BusinessError } from '@kit.BasicServicesKit';
// 查询数据的数据通路枚举类型
let options: unifiedDataChannel.Options = {
intention: unifiedDataChannel.Intention.DATA_HUB
};
try {
unifiedDataChannel.queryData(options, (err, data) => {
if (err === undefined) {
console.info(Succeeded = ${data.length});
for (let i = 0; i < data.length; i++) {
let records = data[i].getRecords();
for (let j = 0; j < records.length; j++) {
if (records[j].getType() === uniformTypeDescriptor.UniformDataType.PLAIN_TEXT) {
let text = records[j] as unifiedDataChannel.PlainText;

}
}
}
} else {
console.error(Failed ${err.code},message is ${err.message} );
}
});
} catch(e) {
let error: BusinessError = e as BusinessError;
console.error(Query ${error.code},message is ${error.message} );
}

上面代码示例,详细演示了一次多对多数据共享的过程以及开发步骤,数据提供方可以通过UMDF提供的insertData接口将数据写入公共数据通路,获取到的返回值,可用于对其插入的数据进行更新和删除操作;数据访问方则可以通过UDMF提供的查询接口获取当前公共数据通路的全量数据。

延伸:数据共享的安全和隐私

虽然数据共享带来开发和使用的极大便利,但是随着现在数据安全的严峻形势,数据隐私越来越成为大家关注的重点,那么在实现跨应用数据共享时,也必须考虑数据安全和用户隐私,这里简单分享一下关于数据共享的安全预防:

  • 权限管理:确保只有具有适当权限的应用才能访问共享数据,切忌没有设置权限。
  • 数据加密:对共享的数据进行加密,确保数据传输的安全性,对敏感数据进行加密处理。
  • 用户授权:在需要时请求用户的明确授权,尊重用户的选择,根据实际需要来选择授权,切忌一键授权所有权限。

结束语

经过本文的详细介绍,大家想必对跨应用数据共享有了更加深入的了解和掌握,我们也可以看到跨应用数据共享是HarmonyOS提升用户体验和促进应用间协作的重要特性。通过HarmonyOS中跨应用数据共享的具体使用示例,可以很好的进行使用掌握。但是,我们在实现数据共享时,也要重视数据安全和用户隐私,确保数据共享的合理性和安全性,这样我们的应用才能既好用又安全!随着HarmonyOS生态的不断发展,跨应用数据共享肯定会变得更加智能、高效和安全!

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

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

相关文章

机器学习——第十四章 概率图模型

目录 14.1 隐马尔可夫模型 14.2 马尔可夫随机场 14.3 条件随机场 14.4学习与推断 14.4.1 变量消去 14.4.2 信念传播 14.5 近似推断 14.5.1 MCMC采样 14.5.2 变分推断 14.6 话题模型 14.1 隐马尔可夫模型 隐马尔可夫模型&#xff08;Hidden Markov Model&#x…

入门 MySQL 数据库:基础指南

简介 MySQL 是一个非常流行的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;广泛用于 Web 应用、企业应用和数据仓库。本博客将引导你从零开始&#xff0c;学习 MySQL 数据库的基础知识。 什么是 MySQL&#xff1f; MySQL 是一个基于 SQL&#xff08;Str…

秒懂Linux之制作简易shell

目录 一.全部代码 二.自定义shell 一.全部代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h>#define SIZE 1024 #define MAX_ARGC 64 #define SEP &…

pnpm【实用教程】2024最新版

pnpm 简介 pnpm 全称 performant npm&#xff0c;即高性能的 npm&#xff0c;由 npm/yarn 衍生而来&#xff0c;解决了 npm/yarn 内部潜在的 bug&#xff0c;极大的优化了性能&#xff0c;扩展了使用场景&#xff0c;被誉为 最先进的包管理工具 安装 pnpm npm i -g pnpm使用 pn…

安全基础学习-SM4加密算法

SM4 是一种中国国家密码标准(GB/T 32907-2016)中定义的分组加密算法,又称为“中国商用密码算法SM4”。它是由中国国家密码管理局发布的,并广泛应用于金融、电子商务和其他需要数据加密的场景。 1、SM4 算法概述 SM4 是一种对称加密算法,意味着加密和解密使用相同的密钥。…

升级 kubeadm 部署的 k8s 集群

文章目录 一、环境二、注意事项1、备份数据2、跨版本升级3、支持的版本偏差3.1、kube-apiserver3.2、kubeklet3.3、kube-proxy3.4、kube-controller-manager、kube-scheduler 和 cloud-controller-manager3.5、kubectl 4、升级流程 三、版本升级&#xff08;补丁版本升级&#…

css 文字图片居中及网格布局

以下内容纯自已个人理解&#xff0c;直接上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…

ervlet、jsp、Cookie、Ajax学习

系列文章目录 第一章 基础知识、数据类型学习 第二章 万年历项目 第三章 代码逻辑训练习题 第四章 方法、数组学习 第五章 图书管理系统项目 第六章 面向对象编程&#xff1a;封装、继承、多态学习 第七章 封装继承多态习题 第八章 常用类、包装类、异常处理机制学习 第九章 集…

Nginx 正则表达式与rewrite

目录 一、正则表达式 二、rewrite 2.1 rewrite简述 2.2 rewrite 跳转 2.3 rewrite 执行顺序 2.4 rewrite 语法格式 三、location 3.1 location 类别 3.2 location常用匹配规则 3.3 location优先级 3.4 示例说明 3.5 匹配规则总结 3.6 三个匹配规则定义 四、实战…

【业务场景实战】如何优雅地进行缓存预热?

从Java基础到中间件再到微服务&#xff0c;我们学了这么多&#xff0c;但遇到真实项目的时候&#xff0c;还是不会根据所学知识&#xff0c;对项目进行改造&#xff1b;或者太久不用早已忘记。学会用才是走得更远&#xff01; 缓存穿透、雪崩&#xff0c;大家都不陌生&#xf…

【Linux操作系统】——Centos7下安装python3.8

1.Centos7下安装python3.8 1.1 安装依赖包 yum install gcc openssl-devel bzip2-devel libffi-devel zlib-devel ncurses-devel sqlite-devel readline-devel readline-devel make在CentOS 7上安装Python时&#xff0c;‌需要安装一些必要的依赖包以确保Python的正常编译和运…

HarmonyOS NEXT - 项目基础框架的搭建

demo 地址: https://github.com/iotjin/JhHarmonyDemo 代码不定时更新&#xff0c;请前往github查看最新代码 HarmonyOS NEXT - 项目基础框架的搭建 序前置工作项目的目录结构主界面实现BaseTabBar代码实现子页面实现路由跳转登录页面和主页面切换登录实现退出登录 序 项目基于…

Spark-环境启动

一、概览 从start-all.sh开始捋&#xff0c;一直捋到Master、Worker的启动并建立通信 二、宏观描述 Master端 1、start-all.sh调用start-master.sh启动Master 2、执行org.apache.spark.deploy.master.Master中main方法 3、通过工厂模式创建RpcEnv子类NettyRpcEnv a、创建…

viper配置文件读取管理库 一个支持12种文件类型,5种远程协议的配置文件管理和加载工具库 使用方法示例

viper是一个不错的配置文件管理库&#xff0c; 他支持的配置文件类型依次有 "json", "toml", "yaml", "yml", "properties", "props", "prop", "hcl", "tfvars", "dotenv&quo…

java:实现简单的验证码功能

效果 实现思路 验证码图片的url由后端的一个Controller生成&#xff0c;前端请求这个Controller接口的时候根据当前时间生成一个uuid&#xff0c;并把这个uuid在前端使用localStorage缓存起来&#xff0c;下一次还是从缓存中获取。 Controller生成验证码之后&#xff0c;把前…

Qt 学习第六天:页面布局

如何设计页面&#xff1f; 有个类似沙盒模式的玩法&#xff0c;Qt Widget Designer可以更好的帮助我们设计页面 点击.ui文件进入 右上方可以看到四种常见的布局&#xff1a; 四种布局 &#xff08;一&#xff09;水平布局horizontalLayout&#xff1a;QHBoxLayout H 是 hori…

c++实现B树(上)

哈喽啊&#xff01;好久不见&#xff0c;甚是想念&#xff01;失踪人口要回归了&#xff0c;时隔一个多月小吉我终于要更新blog了&#x1f389;。在停更的一个多月中&#xff0c;小吉也有在好好学习提升自己&#xff0c;立志给大家呈现好文章。  现在让我们进入正题吧&#xf…

初识C++:开启C++之旅

目录 1.C的第一个程序 2.namesapce命名空间域 2.1namespace的意义 2.2.2namespace的定义 2.3命名空间的使用 3.C输入/输出 4.缺省参数 5.函数重载 6.引用 6.1引用的特性 6.2引用的使用 1.C的第一个程序 c版本&#xff1a; #include<iostream>using std::cout…

kali安装wechart

前言&#xff1a; 突发奇想想在kali安装个wechart&#xff0c;试了下网上的很多&#xff0c;玩坏了一个虚拟机算是找到了一个不错的方法&#xff0c;这里记录下&#xff0c;防迷路 基础配置&#xff1a; 首先修改源&#xff1a; vim /etc/apt/sources.list 注释默认配置&…

EasyCVR视频汇聚平台:打造全栈视频监控系统的基石,解锁可视化管理与高效运维

随着科技的飞速发展&#xff0c;视频监控已成为现代社会不可或缺的一部分&#xff0c;广泛应用于社区、公共场所、工业领域等多个场景。EasyCVR视频汇聚平台&#xff0c;作为一款高性能的视频汇聚管理平台&#xff0c;凭借其强大的视频处理、汇聚与融合能力&#xff0c;在构建全…