当前位置: 首页 > news >正文

HarmonyOS学习(十三)——数据管理(二) 关系型数据库

文章目录

        • 1、基本概念
        • 2、运行机制
        • 3、默认配置与限制
        • 4、接口说明
        • 5、实战:开发“账本”
          • 5.1、创建RdbStore
          • 5.2、创建数据库
          • 5.3、增加数据
          • 5.4、删除数据
          • 5.5、修改数据
          • 5.6、查询数据
          • 5.7、备份数据库
          • 5.8、恢复数据库
          • 5.9、删除数据库

官方文档地址: 通过关系型数据库实现数据持久化-应用数据持久化-ArkData(方舟数据管理)-应用框架 - 华为HarmonyOS开发者 (huawei.com)

1、基本概念
  • 关系数据库:用于关系模型来管理数据的数据库,以行和列的形式存储数据。
  • 谓词:数据库中用来代表数据实体的性质、特征或者数据实体之间关系的词项,主要用来定义数据库的操作条件。
  • 结果集:指用户查询之后的结果集合,可以对数据进行访问。结果集提供了灵活的数据访问方式,可以更方便地拿到用户想要的数据。
  • Sqlite:一款用于嵌入式的轻量型关系数据库。

2、运行机制

关系型数据库对外提供通用的操作接口,底层使用Sqlite作为持久化存储引擎,支持Sqlite具有的所有数据库特征,包括但不限于事务、索引、视图、触发器、外键、参数化查询和预编译SQL语句。

3、默认配置与限制
  1. 系统默认日志方式是WAL(Write Ahead Log)模式,系统默认落盘方式是FULL模式。
  2. 数据库使用的共享内存默认大小为2M。
  3. 数据库中连接池最大数量是4个,用以管理用户的读操作。
  4. 为保证数据的准确性,数据库同一时间只能支持一个写操作。
  5. 当应用被卸载完成后,设备上的相关数据库文件及临时文件会被自动清除。
  6. ArkTS侧支持的基本数据类型:number、string、二进制类型数据、boolean。
4、接口说明

以下是关系型数据库持久化功能的相关接口,大部分为异步接口。异步接口均有callback和Promise两种返回形式,下表均以callback形式为例,更多接口及使用方式请见关系型数据库。

接口名称描述
getRdbStore(context: Context, config: StoreConfig, callback: AsyncCallback): void获得一个RdbStore,操作关系型数据库,用户可以根据自己的需求配置RdbStore的参数,然后通过RdbStore调用相关接口可以执行相关的数据操作。
executeSql(sql: string, bindArgs: Array, callback: AsyncCallback):void执行包含指定参数但不返回值的SQL语句。
insert(table: string, values: ValuesBucket, callback: AsyncCallback):void向目标表中插入一行数据。
update(values: ValuesBucket, predicates: RdbPredicates, callback: AsyncCallback):void根据predicates的指定实例对象更新数据库中的数据。
delete(predicates: RdbPredicates, callback: AsyncCallback):void根据predicates的指定实例对象从数据库中删除数据。
query(predicates: RdbPredicates, columns: Array, callback: AsyncCallback):void根据指定条件查询数据库中的数据。
deleteRdbStore(context: Context, name: string, callback: AsyncCallback): void删除数据库。
5、实战:开发“账本”
5.1、创建RdbStore
import relationalStore from '@ohos.data.relationalStore';private rdbStore:relationalStore.RdbStore = null;private ACCOUNT_TABLE = {tableName: "accountTable",sqlCreate: "CREATE TABLE IF NOT EXISTS accountTable (" +"id INTEGER PRIMARY KEY AUTOINCREMENT," +"accountType INTEGER," +"typeText TEXT," +"amount INTEGER)",columns: ['id', 'accountType', 'typeText', 'amount']};private STORE_CONFIG: relationalStore.StoreConfig = {name: "rdbstore.db", //数据库文件名securityLevel: relationalStore.SecurityLevel.S1, //数据库安全等级encrypt: false, //指定数据库是否加密  默认不加密}aboutToAppear(){//获取一个RdbStorerelationalStore.getRdbStore(this.context,this.STORE_CONFIG,(err,store) => {if(err){console.info(this.LOG_TAG,'getRdbStore failed,err:'+err);return;}console.info(this.LOG_TAG,'getRdbStore success');this.rdbStore = store;store.executeSql(this.ACCOUNT_TABLE.sqlCreate);});}
5.2、创建数据库
//创建表
Button("创建表").width('100%').type(ButtonType.Capsule).onClick(() => {this.rdbStore.executeSql(this.ACCOUNT_TABLE.sqlCreate);})
5.3、增加数据
//添加数据
Button("ADD").width('100%').type(ButtonType.Capsule).margin({top:20}).onClick(() => {let valueBucket1:relationalStore.ValuesBucket = {'accountType':0,'typeText':'购物','amount':20};this.rdbStore.insert(this.ACCOUNT_TABLE.tableName,valueBucket1,(err,rowId) => {if(err){console.info(this.LOG_TAG,'insertData() failed,err : '+ err);return;}else {console.info(this.LOG_TAG,'Succesed in insert data , rowId:'+rowId);}})})
5.4、删除数据
//删除数据
Button("Delete").width('100%').type(ButtonType.Capsule).margin({ top: 20 }).onClick(() => {let predicate: relationalStore.RdbPredicates = new relationalStore.RdbPredicates(this.ACCOUNT_TABLE.tableName);predicate.equalTo('id', 1); //删除id为1的数据this.rdbStore.delete(predicate, (err, rows) => {if(err){console.info(this.LOG_TAG,'deleteData() failed,err: ' + err);return;} else {console.info(this.LOG_TAG,'delete rows:'+rows)}})});
5.5、修改数据
 //修改数据Button("Update").width('100%').type(ButtonType.Capsule).margin({ top: 20 }).onClick(() => {let valueBucket: relationalStore.ValuesBucket = {'accountType': 0,'typeText': '购物','amount': 50};let predicate: relationalStore.RdbPredicates = new relationalStore.RdbPredicates(this.ACCOUNT_TABLE.tableName);predicate.equalTo('typeText', '购物'); //修改购物的值this.rdbStore.update(valueBucket,predicate, (err, rows) => {if(err){console.info(this.LOG_TAG,'update() failed,err: ' + err);return;} else {console.info(this.LOG_TAG,'success update rows count:'+rows);}})});
5.6、查询数据
//查询数据
Button("Query").width('100%').type(ButtonType.Capsule).margin({ top: 20 }).onClick(() => {let predicate: relationalStore.RdbPredicates = new relationalStore.RdbPredicates(this.ACCOUNT_TABLE.tableName);predicate.equalTo('typeText', '购物'); //修改购物的值let result:Array<AccountData> = [];this.rdbStore.query(predicate,['id','accountType','typeText','amount'],(err,resultSet) => {if(err){console.info(this.LOG_TAG,'query() failed,err: ' + err);return;}else {console.info(this.LOG_TAG,'resultSet column name:'+ resultSet.columnNames+'column count:'=resultSet.columnCount);while (resultSet.goToNextRow()){let temp:AccountData = {id:0,accountType:0,typeText:'',amount:0}temp.id = resultSet.getDouble(resultSet.getColumnIndex('id'));temp.accountType = resultSet.getDouble(resultSet.getColumnIndex('accountType'));temp.typeText = resultSet.getString(resultSet.getColumnIndex('typeText'));temp.amount = resultSet.getDouble(resultSet.getColumnIndex('amount'));result.push(temp);}resultSet.close();//释放数据集内存}})});
5.7、备份数据库
this.rdbStore.backup(this.STORE_CONFIG.name,(err) => {if(err){console.info(this.LOG_TAG,'failed backup err;'+err);return;} else {console.info(this.LOG_TAG,'backup  success')} 
});
5.8、恢复数据库
this.rdbStore.restore(this.STORE_CONFIG.name,(err) => {if(err){console.info(this.LOG_TAG,'failed restore err;'+err);return;} else {console.info(this.LOG_TAG,'restore  success')} 
});
5.9、删除数据库
this.rdbStore.deleteRdbStore(this.context,this.STORE_CONFIG.name,(err) => {if(err){console.info(this.LOG_TAG,'failed delete err;'+err);return;} else {console.info(this.LOG_TAG,'delete  success')} 
});

相关文章:

HarmonyOS学习(十三)——数据管理(二) 关系型数据库

文章目录 1、基本概念2、运行机制3、默认配置与限制4、接口说明5、实战&#xff1a;开发“账本”5.1、创建RdbStore5.2、创建数据库5.3、增加数据5.4、删除数据5.5、修改数据5.6、查询数据5.7、备份数据库5.8、恢复数据库5.9、删除数据库 官方文档地址&#xff1a; 通过关系型…...

【工具变量】科技金融试点城市DID数据集(2000-2023年)

时间跨度&#xff1a;2000-2023年数据范围&#xff1a;286个地级市包含指标&#xff1a; year city treat post DID&#xff08;treat*post&#xff09; 样例数据&#xff1a; 包含内容&#xff1a; 全部内容下载链接&#xff1a; 参考文献-pdf格式&#xff1a;https://…...

import torch import torchIllegal instruction的可能解决方法

It is numpy 1.19.5 issue. You can fix it by installing previous minor version. pip3 install numpy1.19.4 参考自&#xff1a;Illegal instruction (core dumped) - Jetson & Embedded Systems / Jetson TX2 - NVIDIA Developer Forums...

[SDX35+WCN6856]SDX35 + WCN6856 WiFi导致系统crash问题分析及解决方案

SDX35 SDX35介绍 SDX35设备是一种多模调制解调器芯片,支持 4G/5G sub-6 技术。它是一个4nm芯片专为实现卓越的性能和能效而设计。它包括一个 1.9 GHz Cortex-A7 应用处理器。 SDX35主要特性 ■ 3GPP Rel. 17 with 5G Reduced Capability (RedCap) support. Backward compati…...

力扣题解2376

大家好&#xff0c;欢迎来到无限大的频道。 今日继续给大家带来力扣题解。 题目描述&#xff08;困难&#xff09;&#xff1a; 统计特殊整数 如果一个正整数每一个数位都是 互不相同 的&#xff0c;我们称它是 特殊整数 。 给你一个 正 整数 n &#xff0c;请你返回区间 …...

浅谈计算机视觉的学习路径1

计算机视觉&#xff08;Computer Vision, CV&#xff09;是人工智能领域的一个重要分支&#xff0c;它的目标是使计算机能够像人类一样理解和处理图像和视频数据。 面向想要从事该方向的大学生&#xff0c;笔者这里给出以下是关于计算机视觉的学习路径建议&#xff1a; 简要了解…...

VScode C语言中文乱码问题解决

&#x1f389; 前言 省流&#xff1a;这不是正经的教学&#xff0c;纯属是作者弱智操作导致的乱码问题&#xff0c;绝不是是什么配置原因导致的。 &#x1f389; 问题描述 贴一下我写的C语言代码&#xff08;太久没写了&#xff0c;最近学数据结构才拾起来&#xff09; #in…...

安全基础学习-AES128加密算法

前言 AES&#xff08;Advanced Encryption Standard&#xff09;是对称加密算法的一个标准&#xff0c;主要用于保护电子数据的安全。AES 支持128、192、和256位密钥长度&#xff0c;其中AES-128是最常用的一种&#xff0c;它使用128位&#xff08;16字节&#xff09;的密钥进…...

Python 项目实践:文件批量处理

Python 项目实践&#xff1a;文件批量处理 文章目录 Python 项目实践&#xff1a;文件批量处理一 背景二 发现问题三 分析问题四 解决问题1 找到所有文件2 找到文件特定字段3 找出复杂的字符串4 替换目标字符串5 验证文件是否正确 五 总结六 完整代码示例七 源码地址 本项目旨在…...

jsonschema - 校验Json内容和格式

1、创建对象 from pydantic import BaseModel from typing import Listclass Person(BaseModel):name: strage: intclass Student(Person): level: int 16friends: List[Person] 2、生成 schema schema Student.model_json_schema()内容如下 {$defs: {Person: {propertie…...

浅谈计算机视觉新手的学习路径

浅谈计算机视觉新手的学习路径 计算机视觉是人工智能领域的一个重要分支&#xff0c;它的研究目标是使计算机能够理解和解释我们视觉可以看到的所有外界世界信息。对于一个计算机视觉领域的新人&#xff0c;学习计算机视觉大致可以分为几个步骤&#xff0c;包括理论基础、实际…...

SQL编程题复习(24/9/19)

练习题 x25 10-145 查询S001学生选修而S003学生未选修的课程&#xff08;MSSQL&#xff09;10-146 检索出 sc表中至少选修了’C001’与’C002’课程的学生学号10-147 查询平均分高于60分的课程&#xff08;MSSQL&#xff09;10-148 检索C002号课程的成绩最高的二人学号&#xf…...

提前解锁 Vue 3.5 的新特性

Vue 3.5 是 Vue.js 新发布的版本&#xff0c;虽然没有引入重大变更&#xff0c;但带来了许多实用的增强功能、内部优化和性能改进。 1. 响应式系统优化 Vue 3.5 进一步优化了响应式系统的性能&#xff0c;并且减少内存占用。尤其在处理大型或深度嵌套的响应式数组时&#xff…...

web基础—dvwa靶场(十)XSS

XSS(DOM) 跨站点脚本&#xff08;XSS&#xff09;攻击是一种注入攻击&#xff0c;恶意脚本会被注入到可信的网站中。当攻击者使用 web 应用程序将恶意代码&#xff08;通常以浏览器端脚本的形式&#xff09;发送给其他最终用户时&#xff0c;就会发生 XSS 攻击。允许这些攻击成…...

搜索引擎onesearch3实现解释和升级到Elasticsearch v8系列(五)-聚合

聚合 聚合基于Query结果的统计&#xff0c;执行过程是搜索的一部分&#xff0c;Onesearch支持0代码构建聚合&#xff0c;聚合目前完全在引擎层 0代码聚合 上图是聚合的配置&#xff0c;包括2个pdm文档聚合统计 termsOfExt term桶聚合&#xff0c;统计ext&#xff0c;如&…...

Pandas中df常用方法介绍

目录 常用方法df.columnsdf.indexdf.valuesdf.Tdf.sort_index()df.sort_values() 案例 常用方法 df.columns df.columns 是 Pandas 中 DataFrame 对象的一个属性&#xff0c;用于获取 DataFrame 中的列标签&#xff08;列名&#xff09;。 基本语法如下&#xff1a; df.col…...

LabVIEW中AVI帧转图像数据

在LabVIEW中&#xff0c;有时需要将AVI视频文件的帧转换为图像数据进行进一步处理。下面详细讲解了如何从AVI视频提取单帧并将其转换为图像数据集群&#xff0c;以便与其他图像处理VI兼容。 问题背景&#xff1a; 用户已经拥有能够处理JPEG图像数据集群的VI&#xff0c;现在希…...

并发与并行的区别:深入理解Go语言中的核心概念

在编程中,并发与并行的区别往往被忽视或误解。很多开发者在谈论这两个概念时,常常把它们混为一谈,认为它们都指“多个任务同时运行”。但实际上,这种说法并不完全正确。如果我们深入探讨并发和并行的区别,会发现它不仅是词语上的不同,更是编程中非常重要的抽象层次,特别…...

小小扑克牌算法

1.定义一个扑克牌类Card&#xff1a; package democard; public class Card {public String suit;//表示花色public int rank;//表示牌点数Overridepublic String toString() {return "{"suit rank"}";}//实例方法&#xff0c;初始化牌的点数和花色public…...

【第34章】Spring Cloud之SkyWalking分布式日志

文章目录 前言一、准备1. 引入依赖 二、日志配置1. 打印追踪ID2. gRPC 导出 三、完整日志配置四、日志展示1. 前端2. 后端 总结 前言 前面已经完成了请求的链路追踪&#xff0c;这里我们通过SkyWalking来处理分布式日志&#xff1b; 场景描述&#xff1a;我们有三个服务消费者…...

别再乱用npm install了!手把手教你用npx only-allow为项目指定包管理器(支持pnpm/yarn/npm)

用only-allow统一团队包管理器&#xff1a;从配置到CI的全流程指南 你是否曾经在拉取一个新项目后&#xff0c;面对npm install、yarn还是pnpm i的抉择感到困惑&#xff1f;或者更糟的是&#xff0c;团队成员混用不同包管理器导致node_modules结构不一致&#xff0c;引发各种诡…...

环境光遮蔽(Ambient Occlusion):揭秘那个让虚拟世界“有重量感“的阴影魔法

一、一个让我"开窍"的老木匠故事 我有个朋友是传统家具的修复师&#xff0c;他给我讲过一个让我至今难忘的故事。他说他刚入行时跟着一位 70 多岁的老木匠师父学习——师父让他做的第一件事不是雕花、不是榫卯——而是"看阴影"——这个看似奇怪的训练改变了…...

用数字逻辑门复刻柏林钟:从二进制编码到硬件实现

1. 项目概述&#xff1a;用数字电路复刻“柏林钟”作为一个在柏林长大的孩子&#xff0c;我从小就对库达姆大街上的那座“柏林钟”着迷。它不像传统时钟那样用指针或数字告诉你时间&#xff0c;而是通过几排不同颜色的发光方块&#xff0c;以一种近乎艺术的方式呈现时间。这种独…...

自制射频功率计:基于AD8317芯片,成本43欧元实现1MHz-10GHz测量

1. 项目概述&#xff1a;为什么我要亲手打造一台射频功率计在无人机和模型飞行器的圈子里&#xff0c;尤其是在我们荷兰FMS Spaarnwoude俱乐部&#xff0c;合规飞行是头等大事。我给我的八轴飞行器加装了云台相机和图传系统&#xff0c;工作在5.8GHz频段。根据本地法规&#xf…...

Sangfor文件夹可以删除吗?【图文讲解】深信服文件夹残留清理?如何彻底删除深信服?Sangfor文件夹是什么?

&#xff08;1&#xff09;问题背景打开C盘&#xff0c;突然冒出个Sangfor 文件夹&#xff0c;占用好几个 GB 空间&#xff0c;想删又不敢删&#xff0c;怕删坏系统、断网崩溃&#xff1b;上网一查&#xff0c;说法五花八门&#xff0c;有人说是病毒&#xff0c;有人说是办公软…...

电子商务设计师软考备战:特别篇 - 综合模拟与备考策略

1. 考试形式与内容结构1.1 考试基本信息考试科目与时间基础知识考试&#xff1a;上午9:00-11:30&#xff08;150分钟&#xff09;应用技术考试&#xff1a;下午2:00-4:30&#xff08;150分钟&#xff09;题型与分值分布上午考试&#xff08;基础知识&#xff09;&#xff1a; -…...

UE5 Mac环境搭好了,然后呢?给新手的第一个5分钟:创建、操控并理解你的第一个角色

UE5 Mac环境搭好了&#xff0c;然后呢&#xff1f;给新手的第一个5分钟&#xff1a;创建、操控并理解你的第一个角色当你第一次打开UE5的Mac版本&#xff0c;面对那个闪烁着光芒的启动界面&#xff0c;内心可能既兴奋又忐忑。安装只是第一步&#xff0c;真正的旅程现在才开始。…...

基于Arduino与nRF24L01+的无线传感器平台设计与部署指南

1. 项目概述与设计思路如果你和我一样&#xff0c;喜欢在阳台或者小院子里种点蔬菜瓜果&#xff0c;那你肯定也遇到过这样的烦恼&#xff1a;出门几天&#xff0c;心里总惦记着家里的番茄苗是不是缺水了&#xff0c;小温室里的温度会不会太高。传统的温湿度计只能让你在现场读数…...

Arcmap实操:如何用‘渔网’给你的地图做一次‘CT扫描’——以韶关市路网密度可视化为例

Arcmap实操&#xff1a;如何用‘渔网’给你的地图做一次‘CT扫描’——以韶关市路网密度可视化为例 想象一下&#xff0c;医生通过CT扫描将人体内部结构分层呈现&#xff0c;而GIS中的"渔网"工具同样能对城市路网进行"切片式"分析。这种空间离散化技术&…...

同步带装配工艺要点与损伤防控策略

一、引言在工业精密传动系统中&#xff0c;盖茨同步带凭借高精度、高效率、无滑差的优势&#xff0c;成为自动化设备、精密机床、输送产线的核心传动部件。多数企业在运维中&#xff0c;普遍将同步带异常磨损、断齿、断带等故障归咎于工况恶劣或产品质量问题&#xff0c;却忽略…...