当前位置: 首页 > 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')} 
});
http://www.lryc.cn/news/442603.html

相关文章:

  • 【工具变量】科技金融试点城市DID数据集(2000-2023年)
  • import torch import torchIllegal instruction的可能解决方法
  • [SDX35+WCN6856]SDX35 + WCN6856 WiFi导致系统crash问题分析及解决方案
  • 力扣题解2376
  • 浅谈计算机视觉的学习路径1
  • VScode C语言中文乱码问题解决
  • 安全基础学习-AES128加密算法
  • Python 项目实践:文件批量处理
  • jsonschema - 校验Json内容和格式
  • 浅谈计算机视觉新手的学习路径
  • SQL编程题复习(24/9/19)
  • 提前解锁 Vue 3.5 的新特性
  • web基础—dvwa靶场(十)XSS
  • 搜索引擎onesearch3实现解释和升级到Elasticsearch v8系列(五)-聚合
  • Pandas中df常用方法介绍
  • LabVIEW中AVI帧转图像数据
  • 并发与并行的区别:深入理解Go语言中的核心概念
  • 小小扑克牌算法
  • 【第34章】Spring Cloud之SkyWalking分布式日志
  • easy-es动态索引支持
  • SWC(Speedy Web Compiler)
  • 【计算机网络】传输层协议UDP
  • Docker+PyCharm远程调试环境隔离解决方案
  • 数字化转型的理论框架对比:从多维视角指导企业成功变革对比DPBOKIT4ITCOBITTOGAF
  • 【C++掌中宝】深入解析C++命名空间:有效管理代码的利器
  • 2024/9/21 leetcode 21.合并两个有序链表 2.两数相加
  • Python学习的主要知识框架
  • LLaMA-Factory 使用 alpaca 格式的数据集
  • 【Mysql】Mysql数据库基础
  • 一文彻底让你搞懂轨迹规划(总结)