HarmonyOS学习(十二)——数据管理(一)分布式数据

news/2024/9/18 6:10:26/ 标签: harmonyos, 学习, 分布式, arkTs, arkUI, 鸿蒙

文章目录

        • 1、分布式数据服务概述
        • 2、KV数据模型(键值对数据库)
        • 3、分布式数据服务的约束和限制
        • 4、接口说明
        • 5、分布式数据服务开发步骤

1、分布式数据服务概述

分布式数据服务(Distributed Data Service ,DDS)为应用程序提供不同设备间数据库的分布式协同能力。

通过调用分布式数据接口,应用程序将数据保存到分布式数据库中。通过结合账号,用用和数据库三元组,分布式数据服务对属于不同应用的数据进行隔离,以保证不同应用之间数据不能通过分布式数据服务互相访问。在通过可信认证的设备间,分布式数据服务支持应用数据相互同步,为用户提供在多种终端设备上最终一致的数据访问体验。

2、KV数据模型(键值对数据库)

KV数据模型是key-value数据模型的简称,其数据以键值对的形式进行组织、索引和存储。

3、分布式数据服务的约束和限制
  1. 分布式数据服务的数据模型仅支持KV模型,不支持外键,触发器等关系数据库中的功能。
  2. 设备协同数据库,针对每条记录,Key的长度≤896 Byte,Value的长度<4 MB。
  3. 单版本数据库,针对每条记录,Key的长度≤1 KB,Value的长度<4 MB。
  4. 每个应用程序最多支持同时打开16个键值型分布式数据库。
  5. 分布式数据库与本地数据库的使用场景不同,因此开发者应识别需要在设备间进行同步的数据,并将这些数据保存到分布式数据库中。
  6. 分布式数据服务针对每个应用当前的流控制机制:kvStore的接口一秒最多访问1000次,一分钟最多访问10000次;kvManager的接口一秒最多访问50次,一分钟最多访问500次。
  7. 分布式数据库事件回调方法中不允许进行阻塞操作,例如修改UI操作。
4、接口说明

以下是键值型数据库持久化功能的相关接口,大部分为异步接口。异步接口均有callback和Promise两种返回形式,下表均以callback形式为例。

接口名称描述
createKVManager(config: KVManagerConfig): KVManager创建一个KVManager对象实例,用于管理数据库对象。
getKVStore(storeId: string, options: Options, callback: AsyncCallback): void指定options和storeId,创建并得到指定类型的KVStore数据库。
put(key: string, value: Uint8Arraystring
get(key: string, callback: AsyncCallback<booleanstring
delete(key: string, callback: AsyncCallback): void从数据库中删除指定键值的数据。

5、分布式数据服务开发步骤
5.1、导入模块
import distributedKVStore from '@ohos.data.distributedKVStore';
5.2、构造分布式数据库管理类实例
let kvManager: distributedKVStore.KVManager | undefined = undefined;
export default class KvStoreDemoAbility extends UIAbility {onCreate(want, launchParam) {let context = this.context;const kvManagerConfig: distributedKVStore.KVManagerConfig = {context: context,bundleName: 'com.example.datamanagertest'}try {//创建KvManager实例kvManager = distributedKVStore.createKVManager(kvManagerConfig)hilog.info(0x0000, 'testTag', "Success in create kvmanager");} catch (e) {let error = e as BusinessError;console.error(`Failed to create KVManager. Code:${error.code},message:${error.message}`);}if (kvManager !== undefined) {kvManager = kvManager as distributedKVStore.KVManager;//进行后续操作//...}}
}
5.3、获取、创建分布式数据库
let kvStore: distributedKVStore.SingleKVStore | undefined = undefined;
try {const options: distributedKVStore.Options = {createIfMissing: true,encrypt: false,backup: false,autoSync: false,// kvStoreType不填时,默认创建多设备协同数据库kvStoreType: distributedKVStore.KVStoreType.SINGLE_VERSION,// 多设备协同数据库:kvStoreType: distributedKVStore.KVStoreType.DEVICE_COLLABORATION,securityLevel: distributedKVStore.SecurityLevel.S1};kvManager.getKVStore<distributedKVStore.SingleKVStore>('storeId', options, (err, store: distributedKVStore.SingleKVStore) => {if (err) {console.error(`Failed to get KVStore: Code:${err.code},message:${err.message}`);return;}console.info('Succeeded in getting KVStore.');kvStore = store;// 请确保获取到键值数据库实例后,再进行相关数据操作});
} catch (e) {let error = e as BusinessError;console.error(`An unexpected error occurred. Code:${error.code},message:${error.message}`);
}
if (kvStore !== undefined) {kvStore = kvStore as distributedKVStore.SingleKVStore;//进行后续操作//...
}
5.4、订阅分布式数据库的数据变化
try {kvStore.on('dataChange', distributedKVStore.SubscribeType.SUBSCRIBE_TYPE_LOCAL, function (data) {console.info('datachange callback data:' + JSON.stringify(data))});
} catch (e) {console.info('An unexpected error occured .Erroe:${e}')
}
5.5、插入数据到分布式数据库

调用put()方法向键值对数据库插入数据,当key值存在时,put()方法会修改其值,否则会新增一条数据。

const KEY_TEST_STRING_ELEMENT = 'key_test_string';
const VALUE_TEST_STRING_ELEMENT = 'value_test_string';
try {kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT, (err) => {if (err !== undefined) {console.error(`Failed to put data. Code:${err.code},message:${err.message}`);return;}console.info('Succeeded in putting data.');});
} catch (e) {let error = e as BusinessError;console.error(`An unexpected error occurred. Code:${error.code},message:${error.message}`);
}
5.6、查询分布式数据库数据

调用get()方法获取指定键的值

try {kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT, (err) => {if (err !== undefined) {console.error(`Failed to put data. Code:${err.code},message:${err.message}`);return;}console.info('Succeeded in putting data.');kvStore = kvStore as distributedKVStore.SingleKVStore;kvStore.get(KEY_TEST_STRING_ELEMENT, (err, data) => {if (err != undefined) {console.error(`Failed to get data. Code:${err.code},message:${err.message}`);return;}console.info(`Succeeded in getting data. Data:${data}`);});});
} catch (e) {let error = e as BusinessError;console.error(`Failed to get data. Code:${error.code},message:${error.message}`);
}
5.7、删除分布式数据库数据

调用delete()方法删除指定键值的数据

try {kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT, (err) => {if (err !== undefined) {console.error(`Failed to put data. Code:${err.code},message:${err.message}`);return;}console.info('Succeeded in putting data.');kvStore = kvStore as distributedKVStore.SingleKVStore;kvStore.delete(KEY_TEST_STRING_ELEMENT, (err) => {if (err !== undefined) {console.error(`Failed to delete data. Code:${err.code},message:${err.message}`);return;}console.info('Succeeded in deleting data.');});});
} catch (e) {let error = e as BusinessError;console.error(`An unexpected error occurred. Code:${error.code},message:${error.message}`);
}

http://www.ppmy.cn/news/1525938.html

相关文章

canal.adapter同步 ES 索引创建 大概配置详情

canal.adapter同步 ES 索引创建 大概配置详情 PUT /test {"settings": {"number_of_shards": 1,"number_of_replicas": 0,"analysis": {"analyzer": {"htmlStripAnalyzer": {"filter": ["lower…

LabVIEW多语言支持优化

遇到的LabVIEW多语言支持问题&#xff0c;特别是德文显示乱码以及系统区域设置导致的异常&#xff0c;可能是由编码问题或区域设置不匹配引起的。以下是一些可能的原因及解决方案&#xff1a; 问题原因&#xff1a; 编码问题&#xff1a;LabVIEW内部使用UTF-8编码&#xff0c;但…

【鸿蒙开发 day12】

鸿蒙开发-布局进阶 一.定位1.绝对定位2.相对定位3.定位案例-VIP 二.Z序控制三.层叠布局四.bilibili卡片案例五.list列表容器组件滚动条状态列表分割线 六.通用属性七.动画八.图形变换1.平移2.定位结合平移实现精准定位3.旋转和缩放 九.总结 一.定位 作用&#xff1a;改变组件位…

机器学习-------数据标准化

什么是归一化&#xff0c;它与标准化的区别是什么&#xff1f; 一 作用 在做训练时&#xff0c;需要先将特征值与标签标准化&#xff0c;可以防止梯度防炸和过拟合&#xff1b; 将标签标准化后&#xff0c;网络预测出的数据是符合标准正态分布的—StandarScaler()&#xff0c…

setImmediate() vs setTimeout() 在 JavaScript 中的区别

setImmediate() vs setTimeout() 在 JavaScript 中的区别 在 JavaScript 中&#xff0c;setImmediate() 和 setTimeout() 都用于调度任务&#xff0c;但它们的工作方式不同。 JavaScript 的异步特性 JavaScript 以其非阻塞、异步行为而闻名&#xff0c;尤其是在 Node.js 环境…

[000-002-01].第03节:Linux系统下Oracle的安装与使用

2.1.Docker安装Oracle 在CentOS7中使用Docker安装Oracle&#xff1a; 1.安装Docker,详细请参考&#xff1a;https://blog.csdn.net/weixin_43783284/article/details/1211403682.拉取镜像&#xff1a; docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g3.下载…

用Blender来烘培模型材质

通常我们在做三维设计&#xff0c;游戏开发的时候&#xff0c;经常需要从网上下载一些3D模型&#xff0c;这些模型采用的材质分辨率通常都不一样&#xff0c;而我们从性能考虑&#xff0c;需要对材质进行统一的处理&#xff0c;例如把材质都统一为2K的分辨率。 我们可以在Blen…

105页PPT:华为ISC集成供应链变革、模式与方法解析

105页PPT:华为ISC变革、模式与方法PPT,下载链接见文末~ 华为ISC&#xff08;Integrated Supply Chain&#xff0c;集成供应链&#xff09;规划管理与变革是华为公司战略转型和提升核心竞争力的关键举措之一。通过多年的努力与实践&#xff0c;华为已经成功构建了一个高效、协同…

怎么把网站设置成HTTPS访问?

有很多的网站尤其是公司网站都是可以HTTPS访问的&#xff0c;而且在地址栏前面还会显示安全锁&#xff0c;这就是HTTPS证书所起到的作用。没有安装HTTPS证书的网站强制用HTTPS访问会被浏览器提醒不安全。那么我们怎么解决这个问题呢&#xff1f; 解决办法 一&#xff1a;首先…

Unity的Button组件进行扩展

废话不多说,在Untiy中,如果想要对Button等组件进行扩展的话,那么不仅仅只需要将新增的属性设置为public或者增加SerializeField字段就行了的,同时需要对Inspector的GUI面板进行修改,以下直接展示代码: using UnityEngine; using UnityEngine.EventSystems; using UnityE…

17、电科院FTU检测标准学习笔记-录波性能

作者简介&#xff1a; 本人从事电力系统多年&#xff0c;岗位包含研发&#xff0c;测试&#xff0c;工程等&#xff0c;具有丰富的经验 在配电自动化验收测试以及电科院测试中&#xff0c;本人全程参与&#xff0c;积累了不少现场的经验 ———————————————————…

Qt 菜单、工具栏 的基本使用

效果 代码 #include "mainwindow.h" #include "ui_mainwindow.h" #include<QToolBar> #include<QDebug> #include<QPushButton>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupU…

【AcWing】快速排序的Go实现

快速排序的Go实现 这一部分参考了AcWing当中使用Go语言实现快速排序的题解&#xff1a;https://www.acwing.com/activity/content/code/content/296206/。 其中有很多部分非常值得参考&#xff0c;故写一个博客进行记录。 Code package mainimport "fmt"func qui…

后端开发刷题 | 矩阵的最小路径和

描述 给定一个 n * m 的矩阵 a&#xff0c;从左上角开始每次只能向右或者向下走&#xff0c;最后到达右下角的位置&#xff0c;路径上所有的数字累加起来就是路径和&#xff0c;输出所有的路径中最小的路径和。 数据范围: 1≤n,m≤500&#xff0c;矩阵中任意值都满足 0≤ai,j…

基于VUE的在线音乐播放管理系统

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于VUE的在线音乐播放管理系统3是前后端分离项目&#xff0c;拥有两种角色 管理员&#xff1a;用户管理、收藏管理、歌手管理、歌曲管理、歌单管理、评论管理等 用户&#xff1a;登录注…

DFS 算法:洛谷B3625迷宫寻路

我的个人主页 {\large \mathsf{{\color{Red} 我的个人主页} } } 我的个人主页 往 {\color{Red} {\Huge 往} } 往 期 {\color{Green} {\Huge 期} } 期 文 {\color{Blue} {\Huge 文} } 文 章 {\color{Orange} {\Huge 章}} 章 DFS 算法&#xff1a;记忆化搜索DFS 算法&#xf…

rust解说

Rust 是一种开源的系统编程语言&#xff0c;由 Mozilla 研究院开发&#xff0c;旨在提供高性能、内存安全且并发性良好的编程体验。 Rust 于 2010 年由 Graydon Hoare 开始设计&#xff0c;并在 2015 年发布了第一个稳定版本。 Rust 的设计目标是解决 C 等传统系统编程语言在…

Java LinkedList 总结

1.特点 LinkedList的内部实现类似于链表&#xff0c;所以使用方法也和链表类似。 2.常用方法 LinkedList list new LinkedList();//创建//插入数据 list.add("jojo");//在尾部插入 list.add(1,"jojo");//在指定位置插入list.addFirst("jojo"…

Docker:对已有的容器,对当前容器映射的端口实时 (增删改查)

首先我的docker已经起了一个容器&#xff0c;我突然想把他的80->80映射的端口改成80->8080 但是我不想去新启动容器&#xff0c;想在现有容器基础上去修改&#xff0c;或者我想删除某个端口映射&#xff08;只是大概思路&#xff09; 如何寻找容器配置文件位置 首先我这…

S3C2440 ARM设备驱动(boot loader,kernel,rootfs)

一、开发板Linux启动需求 1、bootloader 为内核启动准备环境&#xff0c;并引导内核启动 2、kernel&#xff08;linux内核&#xff09; 操作系统的核心&#xff0c;&#xff08;狭义上的操作系统&#xff09; 3、rootfs 一堆有组织的文件 1. bootloader(一个裸机程序) 初始化C…