HarmonyOS NEXT 鸿蒙中关系型数据库@ohos.data.relationalStore API 9+

核心API

@ohos.data.relationalStore API 9+

数据库

数据库是存储和管理数据的系统

数据库(Database)是一个以特定方式组织、存储和管理数据的集合,通常用于支持各种应用程序和系统的运行。它不仅是存放数据的仓库,还通过一定的规则和结构来确保数据的高效查询和管理。‌

数据库的核心特点

  1. 数据存储‌:数据库可以存储大量数据,从百万条到上亿条不等,且数据按特定规则组织,以提高查询效率。
  2. 数据管理‌:数据库通过数据库管理系统(DBMS)进行统一管理,确保数据的安全性、完整性和一致性。
  3. 数据共享‌:数据库支持多用户同时访问,且数据可以被多个应用程序共享和使用。

数据库的常见类型

  1. 关系型数据库‌:基于关系模型,数据以表格形式存储,支持SQL语言进行复杂查询,如MySQL、Oracle等。
  2. 非关系型数据库(NoSQL)‌:适用于非结构化或半结构化数据,具有更好的横向扩展能力,如MongoDB、Redis等。

鸿蒙的关系型数据库用法 @ohos.data.relationalStore API 9+

关系型数据库(Relational Database,RDB)是一种基于关系模型来管理数据的数据库。关系型数据库基于SQLite组件提供了一套完整的对本地数据库进行管理的机制,对外提供了一系列的增、删、改、查等接口,也可以直接运行用户输入的SQL语句来满足复杂的场景需要。支持通过ResultSet.getSendableRow方法获取Sendable数据,进行跨线程传递。

为保证插入并读取数据成功,建议一条数据不要超过2M。超出该大小,插入成功,读取失败。

大数据量场景下查询数据可能会导致耗时长甚至应用卡死,如有相关操作可参考文档批量数据写数据库场景,且有建议如下:

  • 单次查询数据量不超过5000条。
  • 在TaskPool中查询。
  • 拼接SQL语句尽量简洁。
  • 合理地分批次查询。

该模块提供以下关系型数据库相关的常用功能:

  • RdbPredicates: 数据库中用来代表数据实体的性质、特征或者数据实体之间关系的词项,主要用来定义数据库的操作条件。
  • RdbStore:提供管理关系数据库(RDB)方法的接口。
  • ResultSet:提供用户调用关系型数据库查询接口之后返回的结果集合。
  • Transaction:提供管理事务对象的接口。

使用数据库封装一个数据库工具,用于存储录音

在之前的文章中,我们完成了一些录音和播放的功能,但是目前只能现录现播。如果我们想把录音数据存起来,这时候用关系型数据库就比较合适。

  1. 首先我们要准备好要存储的数据类型,并且继承数据库提供的“桶”类型ValuesBucket
  2. 要有一个初始化数据库的方法,获取上下文,并判断是否获取到上下文
  3. 如果数据库不存在就创建relationalStore.getRdbStore,存在就不创建
  4. store.executeSql在数据库中创建或打开表,SQL语句可以去用AI生成
  5. 需要增删改查四个方法
  6. 增:直接传入要添加的数据
  7. 删:创建谓词对象,传入Id,根据id找到行,然后删除
  8. 改:创建谓词对象,传入整个对象,找到修改行,更新
  9. 查:创建谓词对象,传入user_Id,采用游标移动取值,循环到没有下一行为止,每一次循环都在数组中追加当前的行,最后返回一个数组。
import { relationalStore, ValuesBucket } from "@kit.ArkData"
import { InterviewAudioItem } from "../../models"export interface InterviewAudioItem extends ValuesBucket {id: number | nulluser_id: stringname: stringpath: stringduration: numbersize: numbercreate_time: number
}class AudioDB {store?: relationalStore.RdbStoretableName = 'success_audio'// 1. 初始化数据库和数据库表async initStore() {// 1.0 获取上下文const ctx = AppStorage.get<Context>('context')if (ctx) {// 1.1 创建数据库// 有则获取, 没有则创建const store = await relationalStore.getRdbStore(ctx, {name: 'interview_audio.db',securityLevel: relationalStore.SecurityLevel.S1})// 1.2 在数据库中创建一张数据库表store.executeSql(`CREATE TABLE IF NOT EXISTS ${this.tableName} (id INTEGER PRIMARY KEY AUTOINCREMENT,user_id TEXT NOT NULL,name TEXT NOT NULL,path TEXT NOT NULL,duration INTEGER NOT NULL,size INTEGER NOT NULL,create_time INTEGER NOT NULL)`)this.store = store}}// 2. 添加一条音频数据async insert(item: InterviewAudioItem) {if (this.store) {const rowId = await this.store.insert(this.tableName, item)if (rowId === undefined || rowId === -1) {return Promise.reject('插入音频数据失败')} else {return Promise.resolve()}}}// 3. 删除一条音频数据async delete(audioId: number) {if (this.store) {const predicates = new relationalStore.RdbPredicates(this.tableName)predicates.equalTo('id', audioId)const rowId = await this.store.delete(predicates)if (rowId === undefined || rowId === -1) {return Promise.reject('删除音频数据失败')} else {return Promise.resolve()}}}// 4. 修改一条音频数据async update(item: InterviewAudioItem) {if (this.store) {const predicates = new relationalStore.RdbPredicates(this.tableName)predicates.equalTo('id', item.id)const rowId = await this.store.update(item, predicates)if (rowId === undefined || rowId === -1) {return Promise.reject('修改音频数据失败')} else {return Promise.resolve()}}}// 5. 根据用户id查询用户所有的录音数据async query(userId: string) {if (this.store) {// 1. 创建一个基于查询条件的谓词对象const predicates = new relationalStore.RdbPredicates(this.tableName)predicates.equalTo('user_id', userId)// 2. 执行数据库查询得到结果集const resultSet = await this.store.query(predicates)if (!resultSet) {return Promise.reject('query fail')}// 3. 采用游标移动取值const list: InterviewAudioItem[] = []// 3.1 如果有下一行, 则继续循环while (resultSet?.goToNextRow()) {list.push(resultSet.getRow() as InterviewAudioItem)}// 3.2 关闭查询结果集resultSet.close()return Promise.resolve(list)}return Promise.reject('暂无数据库')}
}export const audioDB = new AudioDB()

这样一个完整功能的数据库工具就创建好了,那么我们就直接去把录音存到数据库中吧!

在录音页面中使用数据库保存数据

首先在页面开始时初始化数据库

  async aboutToAppear() {await this.getPermission()// 2. 初始化数据库await audioDB.initStore()}

 初始化完成可以在设备管理器中看到三个数据库相关文件

在录制开始的函数中,我们记录下开始时间

在点击结束录制的时候,我们再额外调用一个方法,传入音频类型的项,调用数据库方法插入数据库中。

// 存入数据库方法async onRecordEnd(item: InterviewAudioItem) {await audioDB.insert(item)AlertDialog.show({ message: '录音保存成功' })}Button('停止录制').onClick(() => {this.stopRecord()// 以只读的方式根据路径打开文件const file = fileIo.openSync(this.filePath, fileIo.OpenMode.READ_ONLY)const stat = fileIo.statSync(file.fd)this.onRecordEnd({id: null,user_id: auth.getUser().id,name: dayjs().format('YYYY年MM月DD日_hh点mm分ss秒'),path: this.filePath || '',duration: Date.now() - this.startTime,create_time: Date.now(),size: stat.size})promptAction.showToast({ message: '停止录制' })})

 点击开始录音录制一段时间,然后结束录制

这样一条数据就被插入了数据库表中,对比数据库文件发现,确实比之前大了,就说明已经插入完成,因为没有可视化打开数据库的工具,所有无法具体查看数据表的内容。

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

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

相关文章

用HTML和CSS生成炫光动画卡片

这个效果结合了渐变、旋转和悬浮效果的炫酷动画示例&#xff0c;使用HTML和CSS实现。 一、效果 二、实现 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport&quo…

蓝桥杯第10届 后缀表达式

题目描述 给定 N 个加号、M 个减号以及 NM1 个整数 A1,A2,⋅⋅⋅,ANM1​&#xff0c;小明想知道在所有由这N 个加号、M 个减号以及 NM1 个整数凑出的合法的 后缀表达式中&#xff0c;结果最大的是哪一个&#xff1f; 请你输出这个最大的结果。 例如使用 1 2 3 -&#xff0c…

常见框架漏洞攻略-ThinkPHP篇

漏洞名称&#xff1a;Thinkphp5x远程命令执行及getshell 第一步&#xff1a;开启靶场 第二步&#xff1a;准备工具 第三步&#xff1a;启动工具&#xff0c;进行漏洞检测 #存在漏洞 1.目标存在tp5_invoke_func_code_exec_1漏洞2.目标存在tp5_dbinfo_leak漏洞payload:http://47…

sql长时间卡在gc current request事件

问题描述 凌晨跑批出现超时。SQL f0ng33agbpzhs业务需要执行160w次左右。现场人员杀掉该sql&#xff0c;重新发起业务&#xff0c;业务批次成功跑完。 问题分析 总体sql分析 分析对比sql的awrsqrpt&#xff0c;对比昨天3月8日的。 总体执行次数没有变化。Cpu时间、物理读等均…

MOSN(Modular Open Smart Network)-04-TLS 安全链路

前言 大家好&#xff0c;我是老马。 sofastack 其实出来很久了&#xff0c;第一次应该是在 2022 年左右开始关注&#xff0c;但是一直没有深入研究。 最近想学习一下 SOFA 对于生态的设计和思考。 sofaboot 系列 SOFAStack-00-sofa 技术栈概览 MOSN&#xff08;Modular O…

使用 Python 开发 MCP Server 及 Inspector 工具详解

使用 Python 开发 MCP Server 及 Inspector 工具详解 前言 模型上下文协议 (Model Context Protocol, MCP) 是一种新兴的协议&#xff0c;旨在让大型语言模型 (LLM) 更容易地与外部工具和服务集成。本文将介绍如何使用 Python 开发一个 MCP Server&#xff0c;并详细讲解如何使…

深入剖析 IS - IS 路由协议的原理、配置及与 OSPF 的对比

目录 ISIS概述 NSAP&#xff08;类似于IP地址&#xff09; NET NET配置举例 IS-IS 和OSPF区域划分的区别 区域和区域的分界点 IS-IS路由器的分类 Level-1路由器 Level-2路由器 Level-1-2路由器 ISIS支持的网络类型 ISIS开销值 IS-IS报文格式 IS-IS报文类型概述…

【deepseek 学c++】weakptr引用场景

std::weak_ptr 是 C 中与 std::shared_ptr 配合使用的智能指针&#xff0c;它本身不拥有资源的所有权&#xff0c;仅观察资源的状态&#xff0c;主要用于解决 shared_ptr 的循环引用问题和临时访问共享资源的需求。以下是 weak_ptr 的典型应用场景和核心价值&#xff1a;![ 为…

23种设计模式-适配器(Adapter)设计模式

适配器设计模式 &#x1f6a9;什么是适配器设计模式&#xff1f;&#x1f6a9;适配器设计模式的特点&#x1f6a9;适配器设计模式的结构&#x1f6a9;适配器设计模式的优缺点&#x1f6a9;适配器设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是…

R语言对偏态换数据进行转换(对数、平方根、立方根)

我们进行研究的时候经常会遇见偏态数据&#xff0c;数据转换是统计分析和数据预处理中的一项基本技术。使用 R 时&#xff0c;了解如何正确转换数据有助于满足统计假设、标准化分布并提高分析的准确性。在 R 中实现和可视化最常见的数据转换&#xff1a;对数、平方根和立方根转…

REC一些操作解法

一.Linux命令长度突破 1.源码如下 <?php $param $_REQUEST[param];if ( strlen($param) < 8 ) {echo shell_exec($param); } 2.源码分析 echo执行函数&#xff0c;$_REQUEST可以接post、get、cookie传参 3.破题思路 源码中对参数长度做了限制&#xff0c;小于8位&a…

16个气象数据可视化网站整理分享

好的&#xff01;以下是关于“16个气象数据可视化网站整理分享”的软文&#xff1a; 16个气象数据可视化网站整理分享 气象数据可视化已成为现代气象研究、决策支持以及公众天气服务的重要组成部分。从天气预报到气候变化监测&#xff0c;全球许多气象数据可视化平台为专业人士…

Stereolabs ZED Box Mini:机器人与自动化领域的人工智能视觉新选择

在人工智能视觉技术快速发展的今天&#xff0c;其应用场景正在持续拓宽&#xff0c;从智能安防到工业自动化&#xff0c;从机器人技术到智能交通&#xff0c;各领域都在积极探索如何利用这一先进技术。而 Stereolabs 推出的ZED Box Mini&#xff0c;正是一款专为满足这些多样化…

LeetCode热题100|128.最长连续序列,283.移动零

128.最长连续序列 题目链接&#xff1a;128. 最长连续序列 - 力扣&#xff08;LeetCode&#xff09; 这里要求的一个乱序的数组里连续数字的个数&#xff0c;比如【100 &#xff0c;4&#xff0c;200&#xff0c;1&#xff0c;3&#xff0c;2】 里面连续的数字就是【1&#…

Unity-RectTransform设置UI width

不知道有没人需要这样的代码&#xff0c;就是.sizeDelta //不确定是不是英文翻译的原因&#xff0c;基本很难理解&#xff0c;sizeDeltaSize&#xff0c;//未必完全正确&#xff0c;但这么写好像总没错过 //image 在一个UnityEngine.UI.Image 的数组内foreach (var image in l…

GZCTF平台搭建及题目上传

前言 我用手里的Ubuntu虚拟机搭建的&#xff0c;大家根据自己的实际情况来吧 安装及部署 首先&#xff0c;你的虚拟机需要有Docker和Docker-Compose&#xff0c;前者可以看我之前的文章&#xff0c;另外一个可以输入下面的命令安装&#xff0c;注意先获取管理员权限&#xff…

记录Jmeter 利用BeanShell 脚本解析JSON字符串

下载org.json包(文档说明) #下载地址 https://www.json.org/ # github 地址 https://github.com/stleary/JSON-java # api 文档说明 https://resources.arcgis.com/en/help/arcobjects-java/api/arcobjects/com/esri/arcgis/server/json/JSONObject.htmlBeanShell脚本 import…

在Centos 7环境下安装MySQL

前言&#xff1a;在安装与卸载MySQL时&#xff0c;用户需切换为root&#xff0c;这样安装之后&#xff0c;普通用户也能够使用。 Tips:我们在刚开始学习时&#xff0c;尽量全部使用root进行&#xff0c;适应mysql语句&#xff0c;后面学了用户管理&#xff0c;就可以考虑新建普…

使用HTML5和CSS3实现3D旋转相册效果

使用HTML5和CSS3实现3D旋转相册效果 这里写目录标题 使用HTML5和CSS3实现3D旋转相册效果项目介绍技术栈核心功能实现思路1. HTML结构2. CSS样式解析2.1 基础样式设置2.2 3D效果核心样式2.3 卡片样式 3. JavaScript交互实现3.1 旋转控制3.2 自动播放功能 技术要点总结项目亮点总…

CentOS 7下安装PostgreSQL 15

一、简介 PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统&#xff08;ORDBMS&#xff09;&#xff0c;是以加州大学计算机系开发的POSTGRES&#xff0c;4.2版本为基础的对象关系型数据库管理系统。POSTGRES的许多领先概念只是在比较迟的时候才出现在商业…