HarmonyOS7 数据持久化 relationalStore:数据库实战

发布时间:2026/7/13 1:45:29

HarmonyOS7 数据持久化 relationalStore:数据库实战
文章目录前言第一步建库第二步建表代码实现第三步增插入核心代码第四步查查询第五步改和删常见误区小白必踩完整可运行示例relationalStore 建表与增查完整示例写在最后前言有些数据不能丢用户的笔记、离线缓存的订单、本地的聊天记录。这些得存进本地数据库关掉 app 再打开还在。HarmonyOS 提供了relationalStore关系型数据库底层就是 SQLite。这篇文章我用一个待办事项的小例子把建库、建表、增删改查完整走一遍。跟着敲你就能上手本地数据库。第一步建库import{relationalStore}fromkit.ArkDataimport{BusinessError}fromkit.BasicServicesKitletdb:relationalStore.RdbStoreasyncfunctioninitDB(){constcfg:relationalStore.StoreConfig{name:todo.db,// 数据库文件名securityLevel:relationalStore.SecurityLevel.S1}dbawaitrelationalStore.getRdbStore(getContext(),cfg)}讲解getRdbStore是异步的拿到一个RdbStore实例就是你的数据库连接。securityLevel是安全等级普通本地数据用S1足够涉及隐私的用更高等级。记得await建库是耗时的。第二步建表表结构用 SQL 语句定义。建议在initDB之后执行一次建表代码实现awaitdb.executeSql(CREATE TABLE IF NOT EXISTS todo ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, done INTEGER DEFAULT 0, createTime TEXT ))IF NOT EXISTS保证重复调用不会报错app 第二次启动表已存在。done INTEGERSQLite 没有布尔用 0/1 表示未完成/完成。字段类型TEXT/INTEGER是标准 SQL写过别的数据库的一看就懂。第三步增插入用ValuesBucket装一行数据再insert核心代码import{ValuesBucket}fromkit.ArkDataasyncfunctionaddTodo(title:string){constvalue:ValuesBucket{title:title,done:0,createTime:newDate().toISOString()}awaitdb.insert(todo,value)}ValuesBucket本质是个键值对对象键对应表里字段名。插入后自增id自动生成。第四步查查询asyncfunctiongetAll():PromiseTodo[]{constpredicatesnewrelationalStore.RdbPredicates(todo)predicates.orderByDesc(createTime)// 按时间倒序constresultawaitdb.query(predicates,[id,title,done])// result 是 ResultSet需要手动转成数组constlist:Todo[][]while(result.goToNextRow()){list.push({id:result.getLong(result.getColumnIndex(id)),title:result.getString(result.getColumnIndex(title)),done:result.getLong(result.getColumnIndex(done))1})}result.close()returnlist}要点RdbPredicates是查询条件构造器orderByDesc排序。query返回的是ResultSet游标要用goToNextRow()getXXX()一行行取最后close()释放。转成普通数组后UI 才好用ForEach渲染。第五步改和删asyncfunctiontoggle(id:number,done:boolean){constvalue:ValuesBucket{done:done?1:0}constpnewrelationalStore.RdbPredicates(todo)p.equalTo(id,id)awaitdb.update(value,p)// 按条件更新}asyncfunctionremove(id:number){constpnewrelationalStore.RdbPredicates(todo)p.equalTo(id,id)awaitdb.delete(p)// 按条件删除}改和删都用RdbPredicates指定哪一行equalTo(id, id)。更新时只放要改的字段其余不动。常见误区小白必踩误区说明建表漏IF NOT EXISTSapp 第二次启动表已存在再CREATE直接报错。务必加上。ResultSet 不close()查询返回的游标占资源用完必须close()否则泄漏。忘了主键自增没设AUTOINCREMENT插入重复 id 会冲突。需要唯一标识就用自增主键。下面这段代码可以直接复制到 DevEco Studio 里运行。建议你边读边敲改一改文末「动手改一改」里的参数亲眼看看效果。完整可运行示例relationalStore 建表与增查演示本地关系型数据库的最小闭环建表、插入、查询。完整示例// 关系型数据库建表 插入 查询import{relationalStore}fromkit.ArkDataconstSQL_CREATECREATE TABLE IF NOT EXISTS user ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER )asyncfunctiondemo(db:relationalStore.RdbStore){awaitdb.executeSql(SQL_CREATE)// 建表幂等awaitdb.insert(user,{name:小明,age:18})// 插入一行constrsawaitdb.query(user,[name,age])// 查询while(rs.goToNextRow()){console.info(namers.getString(0) agers.getLong(1))}rs.close()}你会看到什么运行后 Log 里打印出name小明 age18。表已持久化下次启动应用数据还在。动手改一改把age: 18改成age: 20再查一次验证已落库。用db.delete(user, ...)实现按条件删除。给查询加WHERE age 16的 predicates做条件过滤。写在最后relationalStore看着 API 多其实就五个动作建库、建表、增、查、改删。它和普通 SQLite 一模一样会 SQL 就会这个。适合存结构固定、要查询排序的数据。如果只是存一个用户名、一个开关用不着上数据库——下一篇讲的Preferences更轻。选对存储方式比会写代码更重要。

相关新闻

影刀RPA 图片批量压缩与格式转换:处理大量素材

影刀RPA 图片批量压缩与格式转换:处理大量素材

2026/7/13 1:45:29

title: “影刀RPA 图片批量压缩与格式转换:处理大量素材” date: 2026-07-01 author: 林焱 影刀RPA 图片批量压缩与格式转换:处理大量素材 电商运营有几百张产品图,需要统一压缩到500KB以内、统一转成JPEG、统一加水印、统一改尺寸……这类批…

NestOS与openEuler社区:深度探索云底座操作系统的协作开发模式

NestOS与openEuler社区:深度探索云底座操作系统的协作开发模式

2026/7/13 1:35:28

NestOS与openEuler社区:深度探索云底座操作系统的协作开发模式 【免费下载链接】nestos-website nestos-website is the source code repository for the NestOS website 项目地址: https://gitcode.com/openeuler/nestos-website 前往项目官网免费下载&…

BiSheng-Autotuner社区贡献指南:如何参与开源项目开发

BiSheng-Autotuner社区贡献指南:如何参与开源项目开发

2026/7/13 1:35:28

BiSheng-Autotuner社区贡献指南:如何参与开源项目开发 【免费下载链接】BiSheng-Autotuner BiSheng-Autotuner is a automate tuning command line tool for LLVM. 项目地址: https://gitcode.com/openeuler/BiSheng-Autotuner 前往项目官网免费下载&#xf…

九大网盘直链下载助手:一键解锁百度、阿里云盘等平台下载权限的完整指南

九大网盘直链下载助手:一键解锁百度、阿里云盘等平台下载权限的完整指南

2026/7/13 5:45:47

九大网盘直链下载助手:一键解锁百度、阿里云盘等平台下载权限的完整指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中…

MATLAB深度学习实战:从CNN到GAN的完整工作流与模型部署

MATLAB深度学习实战:从CNN到GAN的完整工作流与模型部署

2026/7/13 5:45:47

在实际工程和科研项目中,MATLAB 作为成熟的数值计算平台,为机器学习和深度学习提供了从数据准备到模型部署的完整工作流。特别是对于信号处理、图像分析、控制系统等领域的工程师和研究者,MATLAB 的集成环境和工具箱能够显著降低算法实现的门…

java之动态代理

java之动态代理

2026/7/13 5:45:47

目录[TOC](目录)前言1. 比喻理解2. 代码理解1. 签名2. 参数1&#xff1a;ClassLoader loader (类加载器)3. 参数2&#xff1a;Class<?>[] interfaces (接口数组)4. 参数3&#xff1a;InvocationHandler h (调用处理器)3. 测试与运行4. 代理字节码原理总结前言 通过一个…

CMake GUI 3.28.3 与 VS 2019/2022 协同配置:5步解决“project files may be invalid”

CMake GUI 3.28.3 与 VS 2019/2022 协同配置:5步解决“project files may be invalid”

2026/7/13 5:45:47

CMake GUI 3.28.3 与 Visual Studio 协同配置全指南&#xff1a;从报错到生成的完整解决方案最近在Windows平台上使用CMake构建项目时&#xff0c;不少开发者遇到了"Error in configuration process, project files may be invalid"这个令人头疼的错误提示。作为一名…

C++11 随机数生成——告别 rand()

C++11 随机数生成——告别 rand()

2026/7/13 5:45:47

文章目录C11 随机数生成——告别 rand()一、C 语言的 rand() 有什么问题二、C11 的三大组件三、实战例子3.1 模拟温度&#xff1a;42C 上下波动 2C3.2 模拟误码率&#xff1a;极小数值3.3 生成整数范围四、逐行拆解std::random_device{}()std::mt19937 rng{种子}std::uniform_r…

Axure RP 9 动态面板实现无限级树形菜单:3步交互逻辑与变量控制详解

Axure RP 9 动态面板实现无限级树形菜单:3步交互逻辑与变量控制详解

2026/7/13 5:35:46

Axure RP 9 动态面板实现无限级树形菜单&#xff1a;3步交互逻辑与变量控制详解树形菜单作为信息架构可视化的重要组件&#xff0c;在产品原型设计中扮演着关键角色。本文将深入解析如何利用Axure RP 9的动态面板和中继器&#xff0c;构建支持无限层级扩展的智能树形菜单系统。…

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

2026/7/12 0:03:42

Unity游戏文本翻译架构深度解析&#xff1a;XUnity.AutoTranslator的技术实现与工程实践 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator作为Unity游戏社区中最成熟的文本翻译解决方…

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

2026/7/12 0:03:42

openEuler Raspberry Pi Kernel设备驱动开发指南&#xff1a;为树莓派硬件添加支持 【免费下载链接】raspberrypi-kernel It provides openEuler kernel source for Raspberry Pi 项目地址: https://gitcode.com/openeuler/raspberrypi-kernel 前往项目官网免费下载&…

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

2026/7/12 0:03:42

openEuler系统集成测试实战&#xff1a;基于smoke-test套件的环境验证技巧 【免费下载链接】integration-test The repo contains test suits for system integration test 项目地址: https://gitcode.com/openeuler/integration-test 前往项目官网免费下载&#xff1a;…

卡梅德生物技术快报|纯化重组蛋白:变异链球菌 SepM 截短蛋白载体构建、诱导优化与纯化重组蛋白全套参数方案

卡梅德生物技术快报|纯化重组蛋白:变异链球菌 SepM 截短蛋白载体构建、诱导优化与纯化重组蛋白全套参数方案

2026/7/13 0:05:25

1 研究背景与现存技术痛点&#xff08;提出问题&#xff09;在口腔微生物分子机制研究中&#xff0c;SepM 蛋白酶是调控变异链球菌群体感应、致龋菌素合成的核心功能蛋白&#xff0c;体外功能验证、抗体开发均依赖高纯度可溶性 SepM 蛋白。当前原核表达体系针对 SepM 存在三大技…

卡梅德生物技术快报|重组蛋白的表达和纯化:IMAC 金属螯合色谱全流程工艺手册|基质 - 配基 - 金属离子匹配与蛋白质分离纯化参数优化

卡梅德生物技术快报|重组蛋白的表达和纯化:IMAC 金属螯合色谱全流程工艺手册|基质 - 配基 - 金属离子匹配与蛋白质分离纯化参数优化

2026/7/13 0:05:25

1 研究背景与现存技术痛点&#xff08;提出问题&#xff09;基因工程、蛋白质组学、生物制药研发流程中&#xff0c;蛋白质分离纯化是决定下游实验成败的关键环节。当前实验室常规蛋白质分离纯化工艺存在三类难以标准化的技术瓶颈&#xff1a;传统离子交换、分子筛层析无特异性…

卡梅德生物技术快报|蛋白质分离纯化:肠激酶可溶性原核表达 + 两步层析全参数|标准化蛋白质分离纯化 SOP

卡梅德生物技术快报|蛋白质分离纯化:肠激酶可溶性原核表达 + 两步层析全参数|标准化蛋白质分离纯化 SOP

2026/7/13 0:05:25

研究痛点提出&#xff08;提出问题&#xff09;重组肠激酶是融合标签切除核心工具酶&#xff0c;当前原核表达体系存在三大标准化难题&#xff0c;直接阻碍可复现的蛋白质分离纯化流程搭建&#xff1a;Trx、GST、单 SUMO 标签融合产物绝大多数为包涵体&#xff0c;沉淀占比超 9…