【鸿蒙学习笔记】关系型数据库概述
目录标题
- 关系型数据库的运行机制
- 样例代码
- 共通方法 DBUtils
- Index 代码
- 效果
关系型数据库的运行机制
1、 关系型数据库对应用提供通用的操作接口,底层使用SQLite作为持久化存储引擎,支持SQLite具有的数据库特性,包括但不限于事务、索引、视图、触发器、外键、参数化查询和预编译SQL语句。

样例代码
共通方法 DBUtils
import relationalStore from '@ohos.data.relationalStore'
import { common } from '@kit.AbilityKit'export class DBUtils {// 数据库名称private tableName: string = 'accountTable'// 建表语句private sqlCreate: string = 'CREATE TABLE IF NOT EXISTS accountTable(id INTEGER PRIMARY KEY AUTOINCREMENT, accountType INTEGER, typeText TEXT, amount INTEGER)'// 表字段private columns: string[] = ['id', 'accountType', 'typeText', 'amount']// 数据库核心类private rdbStore: relationalStore.RdbStore | null = null// 数据库配置DB_CONFIG: relationalStore.StoreConfig = {name: 'RdbTest.db', // 数据库文件名securityLevel: relationalStore.SecurityLevel.S1, // 数据库安全级别};/*** 获取rdb* @param context:上下文* @param callback:回调函数,我们第一次获取数据时,需要在获取到rdb之后才能获取,所以有此回调*/getRdbStore(context: common.UIAbilityContext, callback: Function) {relationalStore.getRdbStore(context, this.DB_CONFIG, (error, store) => {if (this.rdbStore !== null) {//如果已经有rdb,直接建表store.executeSql(this.sqlCreate)return}//保存rdb,下边会用this.rdbStore = store//建表store.executeSql(this.sqlCreate)console.log("test", "successed get dbStore")if (callback) callback()})}/*** 插入数据* @param data:数据对象* @param callback:回调函数,这里的结果是通过回调函数返回的(也可使用返回值)*/insertData(data: AccountData, callback: Function) {//将数据对象,转换为ValuesBucket类型const valueBucket: relationalStore.ValuesBucket = generateValueBucket(data);// 调用insert插入数据this.rdbStore && this.rdbStore.insert(this.tableName, valueBucket, (err, res) => {if (err) {console.log("test,插入失败", err)callback(-1)return}console.log("test,插入成功", res)callback(res) //res为行号})}/*** 获取数据* @param callback:接收结果的回调函数*/query(callback: Function) {//predicates是用于添加查询条件的let predicates = new relationalStore.RdbPredicates(this.tableName)// 查询所有,不需要条件// predicates.equalTo("字段",数据)this.rdbStore && this.rdbStore.query(predicates, this.columns, (error, resultSet: relationalStore.ResultSet) => {if (error) {console.log("test,获取数据失败", JSON.stringify(error))return}let rowCount: number = resultSet.rowCountconsole.log("test", "数据库中数据数量:" + rowCount) //没数据时返回-1或0if (rowCount <= 0 || typeof rowCount === 'string') {callback([])return}let result: AccountData[] = []//上来必须调用一次goToNextRow,让游标处于第一条数据,while(resultSet.goToNextRow())是最有写法while (resultSet.goToNextRow()) {let accountData: AccountData = { id: 0, accountType: 0, typeText: '', amount: 0 }accountData.id = resultSet.getDouble(resultSet.getColumnIndex('id'));accountData.typeText = resultSet.getString(resultSet.getColumnIndex('typeText'))accountData.accountType = resultSet.getDouble(resultSet.getColumnIndex('accountType'))accountData.amount = resultSet.getDouble(resultSet.getColumnIndex('amount'))result.push(accountData)}callback(result)resultSet.close() //释放数据集内容})}
}function generateValueBucket(account: AccountData): relationalStore.ValuesBucket {let obj: relationalStore.ValuesBucket = {};obj.accountType = account.accountType;obj.typeText = account.typeText;obj.amount = account.amount;return obj;
}export class AccountData {id: number = -1;accountType: number = 0;typeText: string = '';amount: number = 0;
}
Index 代码
import { AccountData, DBUtils } from '../uitls/DBUtils';
import { common } from '@kit.AbilityKit';@Entry
@Component
struct Index_DBPage {// 数据库工具类private dbUtils: DBUtils = new DBUtils()private context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext// 账户数据数组@State accountDataArray: AccountData[] = []// 列表的图片数组imageArr: Resource[] = [$r('app.media.foods'), $r('app.media.games'), $r('app.media.fuel')]// 添加数据弹框addDialogController: CustomDialogController = new CustomDialogController({builder: AddDialog({//点击确定的回调confirm: (insertData: AccountData) => {this.onConfirm(insertData)}})})// 界面打开时,查询数据,展示胡静aboutToAppear(): void {this.dbUtils.getRdbStore(this.context, () => {this.queryData()})}// 查询数据方法queryData() {this.dbUtils.query((result: AccountData[]) => {this.accountDataArray = resultconsole.log("test,获取数据成功:", JSON.stringify(this.accountDataArray))})}// 点击确定回调onConfirm(insertData: AccountData) {console.log("test", JSON.stringify(insertData))// 插入数据this.dbUtils.insertData(insertData, (res: number) => {if (res > 0) {// AlertDialog.show({ message: "添加成功" })this.queryData()} else {AlertDialog.show({ message: "添加失败" })}})}build() {Stack() {Column() {Row() {Text('关系型数据库').height(33).fontSize(24).margin({ left: 24 }).fontColor(Color.Red)}.width('100%').justifyContent(FlexAlign.SpaceBetween).margin(12).backgroundColor(Color.Grey)//数据列表List({ space: 20 }) {ForEach(this.accountDataArray, (item: AccountData, index: number) => {ListItem() {Row() {// 图片Image(this.imageArr[item.accountType]).width(40).aspectRatio(1).margin({ right: 16 })// 内容Text(item.typeText).height(22).fontSize(16)Blank().layoutWeight(1)// 金额Text("¥: " + String(item.amount)).height(22).fontSize(16)}.width('90%').padding({ left: 12, right: 12 }).margin({ left: 20 }).backgroundColor('#f1f3f5').padding(10).borderRadius(30)}})}}.width('100%')Button() {Image($r('app.media.add'))}.width(48).height(48).position({ x: '80%', y: '90%' }).onClick(() => {this.addDialogController.open()})}}
}interface Item {icon: Resource;text: string;
}@CustomDialog
struct AddDialog {controller: CustomDialogController;//确认回调confirm?: (insertData: AccountData) => voiditems: Array<Item> = [{ icon: $r('app.media.foods'), text: '吃饭' },{ icon: $r('app.media.games'), text: '娱乐' },{ icon: $r('app.media.fuel'), text: '加油' },]@State currentIndex: number = -1@State money: number = 0build() {Column() {Row() {ForEach(this.items, (item: Item, index) => {Column() {Image(item.icon).width(40).height(40)Text(item.text).fontSize(12).fontColor('#FF007DFF').margin({ top: 8 })}.width(86).aspectRatio(1) //指定当前组件的宽高比.padding({ top: 12 }).margin({ top: 16, left: 12 }).align(Alignment.TopStart).backgroundColor(this.currentIndex === index ? '#ccc' : '#FFF1F3F5').borderRadius(16).onClick(() => {this.currentIndex = index})})}.width('100%').justifyContent(FlexAlign.Center)Row() {Column() {Text('金额').width('100%').fontSize(20).fontColor(Color.Black)Column() {TextInput({placeholder: '请输入金额'}).padding({ left: 0, top: 0, bottom: 0 }).borderRadius(0).backgroundColor(Color.White).type(InputType.Number).onChange((value: string) => {this.money = Number(value)})}.height(48).padding({ top: 15, bottom: 11 }).borderWidth({ bottom: 1 }).borderColor('#33182431')Button("确定").onClick((event: ClickEvent) => {if (this.currentIndex === -1) {AlertDialog.show({ message: "请选择种类" })return}if (this.money === 0) {AlertDialog.show({ message: "请输入金额" })return}let insertData: AccountData = {id: 0,accountType: this.currentIndex,typeText: this.items[this.currentIndex].text,amount: this.money}this.confirm && this.confirm(insertData)this.controller.close()}).width('90%').margin(20)}.width('100%').padding({ left: 12, right: 12 })}.width('100%').margin(20)}}
}
效果

相关文章:
【鸿蒙学习笔记】关系型数据库概述
目录标题 关系型数据库的运行机制样例代码共通方法 DBUtilsIndex 代码效果 关系型数据库的运行机制 1、 关系型数据库对应用提供通用的操作接口,底层使用SQLite作为持久化存储引擎,支持SQLite具有的数据库特性,包括但不限于事务、索引、视图…...
Find My网球拍|苹果Find My技术与网球拍结合,智能防丢,全球定位
网球是球类运动项目之一,网球拍作为这项运动的必备工具,有木质球拍、铝合金球拍、钢质球拍和复合物(尼龙、碳素)球拍,任何材质的球拍均可用于比赛。网球拍由拍头、拍喉、拍柄组成,在使用时还需要配合网球线…...
windows环境下部署多个端口Tomcat服务和开机自启动设置保姆级教程
前言 本文主要介绍了 windows环境下,配置多个Tomcat设置不同端口启动服务。其实在思路上Linux上也是适用的,只是 Linux 上没有可视化客户端,会麻烦些,但总体的思路上是一样的。 注:文章中涉及些文字和图片是搬运了其他…...
科普文:一文搞懂jvm实战(四)深入理解逃逸分析Escape Analysis
概叙 Java 中的对象是否都分配在堆内存中? 好了太抽象了,那具体一点,看看下面这个对象是在哪里分配内存? public void test() { Object object new Object(); }这个方法中的object对象,是在堆中分配内存么࿱…...
中文大模型发展到哪一个阶段了?
中文大模型发展到哪一个阶段了? 近日,中文大模型综合性测评基准SuperCLUE,发布了上半年大模型中文综合评测报告。“百模大战”中,OpenAI的GPT-4o是表现最优秀的大模型,但国内大模型已将差缩小至4.8%。国内大模型崛起迅…...
【PostgreSQL】Spring boot + Mybatis-plus + PostgreSQL 处理json类型情况
Spring boot Mybatis-plus PostgreSQL 处理json类型情况 一、前言二、技术栈三、背景分析四、方案分析4.1 在PostgreSQL 数据库中直接存储 json 对象4.2 在PostgreSQL 数据库中存储 json 字符串 五、自定义类型处理器5.1 定义类型处理器5.2 使用自定义类型处理器 一、前言 在…...
华为910b推理Qwen1.5-72b
前情提要:华为910b部署训练推理大模型,本人之前并没有接触过,所以,写此文档进行记录。 (注意:版本适配很重要!!不然就像我一样走了好多坑~~~) 首先,看一张图…...
legoloam算法环境配置和调试笔记
安装gtsam 参考 Ubuntu20.04安装gtsam记录_gtsam安装-CSDN博客 mkdir buildcd buildcmake .. make -...
如何用CSS3画一个三角形?
要用 CSS3 画一个三角形,可以利用元素的边框和透明边框的特性来实现。以下是一个简单的示例代码: .triangle {width: 0;height: 0;border-left: 50px solid transparent; /* 左边框为透明,控制三角形的左斜边 */border-right: 50px solid tr…...
不同型号的GD32 MCU如何区分?
大家是否碰到过以下应用场景:同一套软件代码希望跑在不同型号的GD32 MCU中,但有些地方需要根据MCU型号进行调整?或者上位机或其他MCU与GD32 MCU通信时需要知道对应的MCU型号是哪个? 此时,我们就需要了解如何获取以及区…...
关于windows下编译xLua插件的流程记录
1.工程准备 1.xLua工程:GitHub - Tencent/xLua: xLua is a lua programming solution for C# ( Unity, .Net, Mono) , it supports android, ios, windows, linux, osx, etc. 2.build_xlua_with_libs工程:GitHub - chexiongsheng/build_xlua_with_libs…...
Hadoop简明教程
文章目录 关于HadoopHadoop拓扑结构Namenode 和 Datanode 基本管理启动Hadoop启动YARN验证Hadoop服务停止Hadoop停止HDFS Hadoop集群搭建步骤准备阶段Java环境配置Hadoop安装与配置HDFS格式化与启动服务测试集群安装额外组件监控与维护: 使用Docker搭建集群使用Hado…...
基于STM32设计的药品柜温湿度监测系统(华为云IOT)(184)
基于STM32设计的药品柜温湿度监测系统(华为云IOT)(184) 文章目录 一、前言1.1 项目介绍【1】项目功能介绍【2】整体需求总结【3】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】ESP8266工作模式配置【3】华为云IOT手机APP界面开发思路1.3 项目开发背景【1】选题的意义【2…...
SpringBoot源码阅读(10)——后处理器
后处理器是在监听器EnvironmentPostProcessorApplicationListener中被加载。 入口在SpringApplication实例方法prepareEnvironment,第343行。 listeners.environmentPrepared(bootstrapContext, environment);这里触发了事件ApplicationEnvironmentPreparedEvent 相…...
【源码开源】C#桌面应用开发:串口调试助手
c#桌面应用开发 1、环境搭建和工程创建:参照番茄定时器项目 工程创建参照 2、界面布局设计 3、具体功能函数 (1)端口扫描: private void btn_com_scan_Click(object sender, EventArgs e){//端口号扫描ReflashPortToComboBox(…...
malloc与free函数的用法(精简全面 · 一看即懂)
前言:Hello大家好😘,我是心跳sy,今天为大家带来malloc函数与free函数的用法,我们一起来看看吧! 目录 一、malloc函数 💫 1、⭐️malloc函数对应的头文件⭐️ 2、⭐️malloc函数的作用⭐️ 3…...
强制升级最新系统,微软全面淘汰Win10和部分11用户
说出来可能不信,距离 Windows 11 正式发布已过去整整三年时间,按理说现在怎么也得人均 Win 11 水平了吧? 然而事实却是,三年时间过去 Win 11 占有率仅仅突破到 29%,也就跳起来摸 Win 10 屁股的程度。 2024 年 6 月 Wi…...
java-命令行连接 mysql
在 Java 中,通过命令行连接 MySQL 可以使用以下步骤。假设您已经安装并配置了 MySQL 5.7。 ### 一、通过命令行连接 MySQL #### 1. 打开命令行终端 在不同的操作系统上打开命令行终端的方式: - **Windows**:按 Win R 键,输入…...
RK3588部署YOLOV8-seg的问题
在使用YOLOV8-seg训练出来的pt模型转为onnx的时候,利用以下仓库地址转。 git clone https://github.com/airockchip/ultralytics_yolov8.git 在修改ultralytics/cfg/default.yaml中的task,mode为model为自己需要的内容后, 执行以下语句 cd …...
Python Linux下编译
注意 本教程针对较新Linux系统,没有升级依赖、处理旧版本Linux的openssl等步骤,如有需要可以查看往期文章,例如:在Centos7.6镜像中安装Python3.9 教程中没有使用默认位置、默认可执行文件名,请注意甄别 安装路径&#…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...
Java数组Arrays操作全攻略
Arrays类的概述 Java中的Arrays类位于java.util包中,提供了一系列静态方法用于操作数组(如排序、搜索、填充、比较等)。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序(sort) 对数组进行升序…...
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章 摘要: 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言,受限于 C 语言本身的内存安全和并发安全问题,开发复杂模块极易引入难以…...
