HarmonyOS开发-数据管理-ArkData(3)- 关系型数据库

继前面两篇首选项数据和键值对数据库,本文介绍HarmonyOS数据管理的第三种数据库形式-关系型数据库

介绍

关系型数据库对应用提供通用的操作接口,底层使用SQLite作为持久化存储引擎,

支持SQLite具有的数据库特性,包括但不限于事务、索引、视图、触发器、外键、参数化查询和预编译SQL语句

关系型数据库的使用场景

关系型数据库基于SQLite组件,适用于存储包含复杂关系数据的场景,比如公司的雇员信息,需要包括姓名、工号、职位等,由于数据之间有较强的对应关系,复杂程度比键值型数据更高,此时需要使用关系型数据库来持久化保存数据。

如图所示:

关系型数据库的约束限制

  1. 系统默认日志方式是WAL(Write Ahead Log)模式,系统默认落盘方式是FULL模式

  2. 数据库中有4个读连接和1个写连接,线程获取到空闲读连接 时,即可进行读取操作。当没有空闲读连接且有空闲写连接时,会将写连接当做读连接来使用。

  3. 为保证数据的准确性,数据库同一时间只能支持一个写操作。

  4. 当应用被卸载完成后,设备上的相关数据库文件及临时文件会被自动清除

  5. ArkTS侧支持的基本数据类型: number 、string 、二进制类型数据、 boolean

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

关系型数据库的开发步骤

第一步:创建数据库

复制代码
const STORE_CONFIG :relationalStore.StoreConfig= {
  name: 'RdbTest.db', // 数据库文件名
  securityLevel:  relationalStore.SecurityLevel.S1, // 数据库安全级别
  encrypt: false, // 可选参数,指定数据库是否加密,默认不加密
  isReadOnly: false // 可选参数,指定数据库是否以只读方式打开。                           };
  // 建表Sql语句,  IDENTITY为bigint类型,sql中指定类型为UNLIMITED  INT
  const SQL_CREATE_TABLE = 'CREATE TABLE  IF  NOT  EXISTS  EMPLOYEE  ( ID INTEGER  PRIMARY  KEY AUTOINCREMENT,  NAME TEXT  NOT  NULL, AGE
  INTEGER, SALARY  REAL,  CODES  BLOB,  IDENTITY  UNLIMITED  INT)';
  //获取RdbStore,构建数据库
  relationalStore.getRdbStore(this.context,  STORE_CONFIG,   (err,  rdbStore)  => {
  //执行建表Sql,创建数据表
  rdbStore.executeSql(CREATE_TABLE_TEST);
});

第二步:插入数据

复制代码
let store: relationalStore.RdbStore  | undefined = undefined;
let value1 = 'Lisa';
let value2 =  18;
let value3 =  100.5;
let value4 = new Uint8Array([1,  2, 3, 4, 5]);
let value5 =  BigInt('15822401018187971961171');
const valueBucket:  relationalStore.ValuesBucket  = {
'NAME': value1,
'AGE': value2,
'SALARY': value3,
'CODES': value4,
'IDENTITY': value5,
};
if  (store  !== undefined) {
(store as relationalStore.RdbStore).insert('EMPLOYEE', valueBucket,  (err:
BusinessError,  rowId: number) => {
if  (err) {// ...
return;
}
console.info(`Succeeded in inserting data. rowId:${rowId}`);
})
}

第三步:修改数据

复制代码
let value6 = 'Rose';  
let value7 = 22;  
let value8 = 200.5;  
let value9 = new Uint8Array([1, 2, 3, 4, 5]);  
let value10 = BigInt('15822401018187971967863');  
const valueBucket1: relationalStore.ValuesBucket = {  
 'NAME': value6,  
 'AGE': value7,  
 'SALARY': value8,  
 'CODES': value9,  
 'IDENTITY': value10,  
};  
// 创建表'EMPLOYEE'的predicates  
let predicates = new relationalStore.RdbPredicates('EMPLOYEE');  
predicates.equalTo('NAME', 'Lisa'); // 匹配表'EMPLOYEE'中'NAME'为'Lisa'的字段  
if (store !== undefined) {  
 (store as relationalStore.RdbStore).update(valueBucket1, predicates, (err:  
 BusinessError, rows: number) => {  
 if (err) { // ...  
 return;  
 }
console.info(`Succeeded in updating data. row count: ${rows}`);
})
}

第四步:删除数据

复制代码
// 删除数据
predicates = new relationalStore.RdbPredicates('EMPLOYEE');
predicates.equalTo('NAME',  'Lisa');
if  (store  !== undefined) {
  (store as relationalStore.RdbStore).delete(predicates,  (err:  BusinessError,  rows:   number) => {
    if  (err) {
      console.error(`Failed to delete data. Code:${err.code},  message:${err.message}`); return;
    }
    console.info(`Delete rows: ${rows}`);
  })
}

第五步:查询数据

复制代码
let predicates = new relationalStore.RdbPredicates('EMPLOYEE');
predicates2.equalTo('NAME', 'Rose');
if (store !== undefined) {
  (store as relationalStore.RdbStore).query(predicates, ['ID', 'NAME', 'AGE', 'SALARY', 'IDENTITY'],
    (err: BusinessError, resultSet) => {
      if (err) {
        console.error(`Failed to query data. Code:${err.code},  message:${err.message}`);
        return;
      }
      // resultSet是一个数据集合的游标,默认指向第-1个记录,有效的数据从0开始。
      while (resultSet.goToNextRow()) {
        const id = resultSet.getLong(resultSet.getColumnIndex('ID'));
        const name = resultSet.getString(resultSet.getColumnIndex('NAME'));
        const age = resultSet.getLong(resultSet.getColumnIndex('AGE'));
        const salary = resultSet.getDouble(resultSet.getColumnIndex('SALARY'));
        const identity = resultSet.getValue(resultSet.getColumnIndex('IDENTITY'));
      }
      // 释放数据集的内存
      resultSet.close();
    })
}

关系型数据库的备份与恢复

关系型数据库通过backup接口实现数据库备份,通过restore接口实现数据库恢复,示例代码如下

复制代码
//在同路径下备份数据库
if (store !== undefined) {
  // "Backup.db"为备份数据库文件名,默认在RdbStore同路径下备份。也可指 定路径:customDir + "backup.db"
  (store as relationalStore.RdbStore).backup("Backup.db", (err: BusinessError) => {
    if (err) {
      console.error(`Failed to backup  RdbStore. Code:${err.code}, message:${err.message}`);
      return;
    }
    console.info(`Succeeded in backing up  RdbStore.`);
  })

  // 从备份数据库中恢复数据
  if (store !== undefined) {
    (store as relationalStore.RdbStore).restore("Backup.db", (err: BusinessError) => {
      if (err) {
        console.error(`Failed to restore  RdbStore. Code:${err.code}, message:${err.message}`);
        return;
      }
      console.info(`Succeeded in restoring  RdbStore.`);
    })
  }

最后是我们关系型数据库的接口说明,如下:

欢迎大家跟我一起学习鸿蒙开发知识,加入我的班级获得HarmonyOS应用开发者认证 每月对前200名学员进行激励,活动期间共计激励1000名

华为开发者学堂

相关推荐
二哈喇子!1 小时前
BOM模型
开发语言·前端·javascript·bom
二哈喇子!1 小时前
Vue2 监听器 watcher
前端·javascript·vue.js
二哈喇子!1 小时前
MySQL数据更新操作
数据库·sql
二哈喇子!1 小时前
MySQL命令行导入数据库
数据库·sql·mysql·vs code
心动啊1211 小时前
SQLAlchemy 的使用
数据库
摘星编程1 小时前
OpenHarmony + RN:Bluetooth连接蓝牙外设
react native·react.js·harmonyos
yanyu-yaya2 小时前
前端面试题
前端·面试·前端框架
二哈喇子!2 小时前
使用NVM下载Node.js管理多版本
前端·npm·node.js
GGGG寄了3 小时前
HTML——文本标签
开发语言·前端·html
小风呼呼吹儿3 小时前
Flutter 框架跨平台鸿蒙开发 - 车辆保养记录器:智能管理车辆保养全流程
flutter·华为·harmonyos