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')} 
});

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

IDEA配置全局的maven环境

1、关闭掉所有打开的项目&#xff0c;然后点击All settings 2、配置maven home path、user setting file、local repository。 3、配置JRE的版本 4、配置字节码版本

【RabbitMQ】死信队列、延迟队列

死信队列 死信&#xff0c;简单理解就是因为种种原因&#xff0c;无法被消费的消息。 有死信&#xff0c;自然就有死信队列。当一个消息在一个队列中变成死信消息之后&#xff0c;就会被重新发送到另一个交换器中&#xff0c;这个交换器就是DLX&#xff08;Dead Letter Excha…

对于C++继承中子类与父类对象同时定义其析构顺序的探究

思考这样一串代码的运行结果&#xff1a; #include <iostream> using namespace std; class Person { public:~Person() { cout << "~Person()" << endl; } }; class Student:public Person { public:~Student() { cout << "~Student(…

谷歌做外链的文章一定要原创吗?

在谷歌上做外链发布时&#xff0c;原创文章是必须的。虽然你可能会想到用一篇文章群发到很多网站&#xff0c;但这种做法并不会带来太大的SEO效果。谷歌非常重视内容的独特性和相关性。如果同样的文章重复发布到多个网站&#xff0c;搜索引擎很快就会识别出这种策略&#xff0c…

开发谷歌插件之GA埋点

目录 一、背景 二、踩坑 三、谷歌插件开发的GA埋点的实现方式 一、背景 开发了一个谷歌插件&#xff0c;领导需要对用户的一些行为进行分析&#xff0c;于是让我在代码里面加上GA埋点。由于我们的PC端的项目一直都有进行GA埋点&#xff0c;当时就想着&#xff0c;这不就是把…

页面关键路径渲染详解

关键路径渲染 浏览器不会等待全部资源都下载完后才进行渲染&#xff0c;而是采用渐进式的渲染方式&#xff0c;本文就介绍一下这种渐进式的渲染方式。 当浏览器获取到用于呈现网页的资源后&#xff0c;通常就会开始渲染网页。那么究竟是在什么时候就会开始渲染&#xff1f; …

LeetCode讲解篇之220. 存在重复元素 III

文章目录 题目描述题解思路题解代码 题目描述 题解思路 我们可以考虑存储数组中连续indexDiff个数字&#xff0c;这样我们只需要在这连续的indexDiff个数字中查找相差小于等于valueDiff的两个数字的问题 对于该查找问题&#xff0c;我们可以考虑使用以valueDiff大小为一个桶&a…

大厂程序员的健身之路

大厂程序员的健身之路 基本信息饮食正餐营养补剂 睡眠训练计划 基本信息 健身时间&#xff1a;2023.03 -> 2024.09体重变化&#xff1a;52kg -> 67kg 饮食 正餐 早餐&#xff1a;不吃午餐&#xff1a;两碗米饭 鱼/鸡肉 蔬菜 酸奶晚餐&#xff1a;两碗米饭 鱼/鸡肉…

简单题35-搜索插入位置(Java and Python)20240919

问题描述&#xff1a; Java&#xff1a; class Solution {public int searchInsert(int[] nums, int target) {int k 0;int i 0;while(i<nums.length){if(nums[i]target){return i;}if(nums[i]<target){k i1;}i;}return k;}}class Solution(object):def searchInsert(…

6.C_数据结构_查询_哈希表

概述 哈希表的查询是通过计算的方式获取数据的地址&#xff0c;而不是依次比较。在哈希表中&#xff0c;有一个键值key&#xff0c;通过一些函数转换为哈希表的索引值。 其中&#xff1a;这个函数被称为哈希函数、散列函数、杂凑函数&#xff0c;记为&#xff1a;H(key) 哈希…

NFT Insider #148:The Sandbox 推出 SHIBUYA Y3K 时尚系列,Azuki 进军动漫 NFT 领域

市场数据 加密艺术及收藏品新闻 Infinex 新推 NFT 系列首四日销售额破4000万美元 尽管顶级 NFT 系列表现不佳&#xff0c;Infinex 的最新 NFT 系列在首四日内销售额已超过 4000 万美元。Infinex 是一个非托管平台&#xff0c;提供轻松访问链上协议和 dApp。 Infinex Core 的…

189 轮转数组

解题思路&#xff1a; \qquad 首先要理解轮转的含义&#xff0c;轮转 将数组末尾元素移动至首位。轮转k不为负数&#xff0c;那如果k大于数组长度时会发生什么&#xff1f;定义n为数组长度&#xff0c;当k n时&#xff0c;数组元素的顺序又恢复成初始状态&#xff0c;下一次…

翻唱技巧:AU和Cubase翻唱录制对轨技巧

分享和记录一下个人翻唱的经验和技巧&#xff01;防止后续自己忘了&#xff01;同时如果有大佬看到&#xff0c;希望可以帮我指出其中的错误&#xff01;个人推荐用Cubase12录制翻唱&#xff0c;因为Cubase12可以做乐段的标记&#xff0c;翻唱时有助于学习一些歌曲的层次设计。…

opengl-redbook环境搭建(静态库)

所需库下载 gl3w(github地址)https://github.com/skaslev/gl3w 使用python3执行根目录下的gen脚本&#xff0c;会生成头文件include文件夹和src下gl3w.c文件。 glfw(github地址)https://github.com/glfw/glfw 本文项目结构 本文如红宝书一致&#xff0c;将glfw和gl3w引入…

【C高级】有关shell脚本的一些练习

目录 1、写一个shell脚本&#xff0c;将以下内容放到脚本中&#xff1a; 2、写一个脚本&#xff0c;包含以下内容&#xff1a; 1、写一个shell脚本&#xff0c;将以下内容放到脚本中&#xff1a; 1、在家目录下创建目录文件&#xff0c;dir 2、dir下创建dir1和dir2 …

【JAVA入门】Day48 - 线程池

【JAVA入门】Day48 - 线程池 文章目录 【JAVA入门】Day48 - 线程池一、线程池的主要核心原理二、自定义线程池三、线程池的大小 我们之前写的代码都是&#xff0c;用到线程的时候再创建&#xff0c;用完之后线程也就消失了&#xff0c;实际上这是不对的&#xff0c;它会浪费计算…

网络流之最大流(EK 模板)

EK的时间复杂度是O( )。 EK 算法 和 dinic 算法的区别是 &#xff1a;EK是通过 bfs 找到一条增广流&#xff0c;然后累加&#xff0c;循环此步骤直到 bfs 找不到增广流&#xff1b;而 dinic 算法 是通过 bfs 分层找到一条增广流&#xff0c;然后通过 dfs 跑完 当前分层图中所…

基于SpringBoot的中小医院管理系统

系列文章目录 1.基于SSM的洗衣房管理系统原生微信小程序LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统LW参考示例 3.基于SpringBootVue的企业人事管理系统LW参考示例 4.基于SSM的高校实验室管理系统LW参考示例 5.基于SpringBoot的二手数码回收系统原生微信小程序LW参考示…

温故--javaproject

nginx反向代理和负载均衡 nginx 反向代理&#xff0c;就是将前端发送的动态请求由 nginx 转发到后端服务器 提高访问速度 因为nginx本身可以进行缓存&#xff0c;如果访问的同一接口&#xff0c;并且做了数据缓存&#xff0c;nginx就直接可把数据返回&#xff0c;不需要真正…

C++_21_模板

模板 简介&#xff1a; 一种用于实现通用编程的机制。 通过使用模板我们可以编写可复用的代码&#xff0c;可以适用于多种数据类型。 C模板的语法使用角括号 < > 来表示泛型类型&#xff0c;并使用关键字 template 来定义和声明模板 概念&#xff1a; c范式编程 特点&…