用鸿蒙打造真正的跨设备数据库:从零实现分布式存储

在这里插入图片描述

网罗开发 (小红书、快手、视频号同名)

  大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。

图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG

我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。

展菲:您的前沿技术领航员
👋 大家好,我是展菲!
📱 全网搜索“展菲”,即可纵览我在各大平台的知识足迹。
📣 公众号“Swift社区”,每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。
💬 微信端添加好友“fzhanfei”,与我直接交流,不管是项目瓶颈的求助,还是行业趋势的探讨,随时畅所欲言。
📅 最新动态:2025 年 3 月 17 日
快来加入技术社区,一起挖掘技术的无限潜能,携手迈向数字化新征程!


文章目录

    • 摘要
    • 引言
  • 鸿蒙分布式数据库开发全流程
    • 导入和初始化分布式数据库
      • 添加依赖
      • 初始化数据库
    • 数据的基本操作:增删改查
      • 插入数据
      • 查询数据
    • 应用场景举例
      • 家庭账本 App:多个设备实时同步账目
      • 校园点名系统:老师和学生设备共享考勤信息
      • IoT家庭场景:设备间共享状态数据
    • QA 环节:常见问题答疑
    • Q1:分布式数据库需要联网吗?
    • Q2:如何确保数据同步成功?
    • Q3:不同设备是否需要权限声明?
    • Q4:可否对分布式数据库加密?
    • 总结

摘要

在设备之间数据联动的时代,鸿蒙系统提供了强大的分布式能力,尤其是分布式数据库(Distributed RDB),可以帮助我们在多个设备间共享和同步数据。你可以在一台手机上存数据,另一台平板直接读取——就像它们共享了同一个数据库一样。

这篇文章就会带你一步一步上手鸿蒙中的分布式数据库,包括如何配置、初始化、增删改查操作,以及如何实现设备间的数据同步。还会提供两个实战场景演示,最后通过问答环节解决你开发中可能遇到的问题。

引言

随着鸿蒙系统的持续发展,它提出的“分布式软总线”理念也在实际开发中发挥了越来越大的作用。尤其是在多设备协同办公、家庭设备数据互通、IoT设备同步控制等方面,分布式数据库成为了连接多端的纽带。

例如,一款笔记软件可以在手机记录内容后自动同步到平板或电视上继续阅读;一个家庭记账 App 能让每个家庭成员的设备实时同步账单信息。听起来像云同步?但鸿蒙是原生设备直连的数据同步,速度快、成本低、体验好。

鸿蒙分布式数据库开发全流程

导入和初始化分布式数据库

添加依赖

entry/build.gradle 文件中加入如下模块依赖(仅供参考):

dependencies {implementation 'ohos:data-distributed'
}

初始化数据库

通过 DatabaseHelper 创建分布式数据库,并设置 Options 指定 setDistributed(true)

import ohos.data.DatabaseHelper;
import ohos.data.distributed.common.Options;
import ohos.data.rdb.ValuesBucket;
import ohos.data.rdb.RdbPredicates;
import ohos.data.distributed.user.RdbDistributedStore;DatabaseHelper helper = new DatabaseHelper(this);// 设置为分布式数据库
Options options = new Options.Builder().setDistributed(true).build();// 获取数据库实例
RdbDistributedStore store = helper.getRdbDistributedStore("MyDistributedDB", options, null);// 创建表
store.executeSql("CREATE TABLE IF NOT EXISTS user (id INTEGER PRIMARY KEY, name TEXT)");

数据的基本操作:增删改查

插入数据

ValuesBucket values = new ValuesBucket();
values.putInteger("id", 1);
values.putString("name", "张三");store.insert("user", values);

查询数据

RdbPredicates predicates = new RdbPredicates("user");
ResultSet resultSet = store.query(predicates, null);  // 查询所有字段while (resultSet.goToNextRow()) {int id = resultSet.getInt(resultSet.getColumnIndexForName("id"));String name = resultSet.getString(resultSet.getColumnIndexForName("name"));HiLog.info(LABEL_LOG, "用户ID: %{public}d, 姓名: %{public}s", id, name);
}
resultSet.close();

应用场景举例

家庭账本 App:多个设备实时同步账目

场景:父亲在手机上记了一笔支出,儿子在平板上几秒钟后就能看到这条记录。

// 添加一条消费记录
ValuesBucket expense = new ValuesBucket();
expense.putInteger("id", 1001);
expense.putString("name", "超市购物");store.insert("user", expense);

设备之间自动同步,无需手动操作或云服务支持。只要它们在同一鸿蒙分布式网络下,数据就能共享。

校园点名系统:老师和学生设备共享考勤信息

场景:老师在课堂用手机记录学生签到信息,系统会自动同步到教务办公室的鸿蒙平板。

store.executeSql("CREATE TABLE IF NOT EXISTS attendance (stu_id INTEGER, status TEXT)");ValuesBucket row = new ValuesBucket();
row.putInteger("stu_id", 202306);
row.putString("status", "出勤");store.insert("attendance", row);

IoT家庭场景:设备间共享状态数据

场景:智能空调把当前温度写入分布式数据库,智能窗帘读取这个数据决定是否开启。

store.executeSql("CREATE TABLE IF NOT EXISTS home_status (device TEXT, value TEXT)");ValuesBucket temp = new ValuesBucket();
temp.putString("device", "temperatureSensor");
temp.putString("value", "28");store.insert("home_status", temp);

QA 环节:常见问题答疑

Q1:分布式数据库需要联网吗?

不需要依赖互联网,但设备之间需要通过鸿蒙的分布式软总线连接在同一局域网或近场通信环境中。

Q2:如何确保数据同步成功?

使用 KvManager 等模块可监听数据同步事件,确保同步完成后再进行业务操作。

Q3:不同设备是否需要权限声明?

是的,需要声明分布式相关权限,如:

<uses-permission ohos:name="ohos.permission.DISTRIBUTED_DATASYNC" />

Q4:可否对分布式数据库加密?

目前 RDB 本身支持加密,但分布式场景需要额外的安全控制,可以配合 DataEncryptionUtils 等工具。

总结

鸿蒙的分布式数据库功能,为开发者打开了多设备数据互通的新大门。相比传统的云端存储方案,它更快速、更私密、更适合本地设备联动场景。

无论你是做多端协同办公、智能家居,还是教育、医疗等应用场景,都可以考虑利用鸿蒙原生的分布式数据库功能,把数据真正“跑”起来,跑到用户每一个设备上。

下一步,你可以试着将已有的单机数据模型升级成分布式结构,再配合 分布式 UI多设备协同 等特性,打造完整的分布式体验。

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

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

相关文章

【Docker基础】Docker数据卷:数据卷的作用与使用场景

目录 1 Docker数据卷概述 1.1 什么是数据卷 1.2 数据卷的核心特性 3 数据卷与绑定挂载的对比 2.1 技术对比 2.2 选择建议 3 数据卷的核心作用 3.1 数据持久化 3.2 数据共享 3.3 备份与迁移 4 数据卷使用场景详解 4.1 数据库应用 4.2 日志集中管理 5 数据卷操作全…

安装GPU版本的Pytorch

前言 Pytorch是深度学习框架,在工作中我们一般是使用GPU版本的Pytorch,提高运行效率 安装GPU版本的Pytorch需要先安装CUDA和CUANN这两个GPU环境 如果准备安装GPU版本的Pytorch安装同志没有安装CUDA和CUANN,请看我上一篇文章 RTX5070显卡安装CUDA和CUDNN-CSDN博客 目录 安装…

微信小程序学习笔记

微信小程序学习笔记 一、文件和目录结构介绍 小程序包括&#xff1a;主体文件、页面文件 主体文件&#xff1a; app.js&#xff1a;小程序入口文件app.json&#xff1a;小程序的全局配置文件app.wxss&#xff1a;小程序的全局样式 页面文件&#xff1a;是每个页面所需的文…

抓包之通过wireshark抓ping包

写在前面 本文看下如何抓ping包。 1&#xff1a;正文 因为ping使用的是icmp协议&#xff0c;所以这里我们可以通过过滤icmp协议来进行抓包&#xff1a; 其中对于icmp请求报文状态码是8&#xff0c;如下&#xff1a; 响应状态码是0&#xff1a; 如下图是一个局域网环境中…

大文件分片上传 — nodejs

上传文件路由&#xff1a; var express require(express); var router express.Router(); const multer require(multer); const fs require(fs); const path require(path);// 确保上传目录存在 const uploadDir path.join(__dirname, ../backend/uploads); const temp…

HarmonyOS File和base64字符串转换

1. HarmonyOS File和base64字符串转换 1.1. Base64 1.1.1. Base64认知 Base64 是一种基于64个 ASCII 字符来表示二进制数据的表示方法&#xff0c;这个64个不同的字符为&#xff1a;   &#xff08;1&#xff09;大、小写字母&#xff08;A– Z、a–z&#xff09;。52个  …

【NodeJs】【npm】npm安装electron报错

解决问题 npm安装electron报错一般来说是镜像源的问题。 electron的镜像源与一般的 vue 之类的镜像源地址不一样需要单独配置。 npm读取的全局配置一般是在 C:\Users\{用户}\.npmrc 这个配置文件中。 如果你找不到你的配置文件可以执行如下命令, # 执行后会直接用txt打开你的…

植物small RNA靶基因预测软件,psRobot

psRoto软件安装 网址 http://omicslab.genetics.ac.cn/psRobot/downloads.php下载和安装 wget http://omicslab.genetics.ac.cn/psRobot/program/WebServer/psRobot_v1.2.tar.gz # tar -zxvf psRobot_v1.2.tar.gz # cd psRobot_v1.2 ## ./configure make make installpsRot…

翻译服务器

基于UDP编程博客里的回显服务器代码,翻译服务只需要改process方法即可 所以我们可以创建一个UdpDictServer直接继承UdpEchoServer然后重写process方法 在重写的方法中完成翻译的过程 代码: package network;import java.io.IOException; import java.net.SocketException; …

初等变换 线性代数

初等变换 介绍了三种初等变换的操作。 初等矩阵 初等矩阵是干嘛的呢&#xff1f;实际上初等矩阵就是我们矩阵的初等操作&#xff0c;每一个对矩阵的初等变换操作都相当于乘上一个初等矩阵。 左乘初等矩阵就相当于对行进行初等操作&#xff0c;右乘则相当于对列进行初等操作。…

Java基础 集合框架 队列架构 双端队列 Deque

双端队列 Deque Deque 方法简介Deque 核心特点Deque实现类 ArrayDequeArrayDeque 构造方法ArrayDeque 的数据结构及实现原理ArrayDeque 方法介绍ArrayDeque 核心特性ArrayDeque 总结ArrayDeque 使用样例代码 Deque实现类 LinkedListDeque实现类 ConcurrentLinkedDeque (非阻塞线…

【Spring】——事务、整合、注解

目录 一.Spring与mybatis的整合 1.配置文件 ​编辑2. 二.事务 1.事务属性 2.传播属性 3.异常属性 4.常见配置 三.注解 1.什么是注解 2.Autowired 1.用户自定义注解 ​编辑​编辑2.JDK类型注入value 3.Bean 1.对象的创建 2.对象创建次数 3.Bean注解的注入 1.自…

Linux 离线下安装gcc、g++

描述 离线时编译Redis、nginx等编译包&#xff0c;需要gcc安装包&#xff0c;评论提醒我 上传补充 操作 1、进入gcc目录&#xff0c;并执行安装命令 rpm -ivh *.rpm --nodeps --force查看版本 gcc -v2、进入gcc-c目录&#xff0c;并执行安装 rpm -ivh *.rpm --nodeps --f…

融智学定律3:流动创造价值仅当跨域协同

关键公式意义&#xff1a; 人流方程中的 α/β 反映城市吸引力不对称性 物流优化中的 η 实现时间价值货币化 金流模型的 σ(⋅) 捕捉市场情绪突变点 信息熵的 ∥gi​−gj​∥ 度量知识势差驱动 当五流在黎曼流形上满足 ∇_μ​T^μν0&#xff08;能量动量守恒&#xff09…

趣味数据结构之——数组

你们一定都听说过它的故事…… 是的没错&#xff0c;就是一个萝卜一个坑。ಥ◡ಥ 想象一下数组就是那个坑&#xff0c;那么定义数组就是在挖坑。 元素就是萝卜。 坑就在那里(地上)&#xff0c;整整齐齐地排在那里。 于是数组最重要的一个特性就显现出来了——随机存取。还…

PR-2025《Scaled Robust Linear Embedding with Adaptive Neighbors Preserving》

核心思想分析 这篇论文的核心思想在于解决线性嵌入&#xff08;linear embedding&#xff09;与非线性流形结构之间的不匹配问题。传统方法通过保留样本点间的亲和关系来提取数据的本质结构&#xff0c;但这种方法在某些情况下无法有效捕捉到数据的全局或局部特性。此外&#…

Redis-渐进式遍历

之前使用的keys查找key,一次获取到了所有的key,当key较多时,这个操作就有可能造成Redis服务器阻塞.特别是keys *操作. 于是可以通过渐进式遍历,每次获取部分key,通过多次遍历,既查询到了所有的key,又不会卡死服务器. 渐进式遍历不是通过一个命令获取到所有元素的,而是由一组命…

ISP Pipeline(3):Lens Shading Correction 镜头阴影校正

上一篇文章讲的是&#xff1a;ISP Pipeline&#xff08;2&#xff09;&#xff1a; Black Level Compensation:ISP Pipeline&#xff08;2&#xff09;&#xff1a;Black Level Compensation 黑电平补偿-CSDN博客 视频&#xff1a;(4) Lens Shading Correction | Image Signal…

什么是WebAssembly(WASM)

WebAssembly&#xff08;WASM&#xff09; 是一种高性能的低级编程语言字节码格式&#xff0c;可在网页和非网页环境中运行&#xff0c;支持多语言编译&#xff0c;运行速度接近原生代码。它在区块链中的作用是&#xff1a;作为智能合约的执行引擎&#xff0c;被多条非以太坊链…

【C++】inline的作用

一、inline的作用 1.1函数内联 作用​&#xff1a;建议编译器将函数调用替换为函数体代码&#xff0c;减少函数调用的开销&#xff08;压栈/跳转&#xff09;。​注意​&#xff1a;这只是对编译器的建议&#xff0c;编译器可能忽略&#xff08;如函数体过大或递归&#xff0…