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名

华为开发者学堂

相关推荐
消失的旧时光-19435 小时前
Kotlinx.serialization 对多态对象(sealed class )支持更好用
java·服务器·前端
少卿6 小时前
React Compiler 完全指南:自动化性能优化的未来
前端·javascript
广州华水科技6 小时前
水库变形监测推荐:2025年单北斗GNSS变形监测系统TOP5,助力基础设施安全
前端
广州华水科技6 小时前
北斗GNSS变形监测一体机在基础设施安全中的应用与优势
前端
七淮6 小时前
umi4暗黑模式设置
前端
8***B6 小时前
前端路由权限控制,动态路由生成
前端
光泽雨6 小时前
python学习基础
开发语言·数据库·python
军军3606 小时前
从图片到点阵:用JavaScript重现复古数码点阵艺术图
前端·javascript
znhy@1236 小时前
Vue基础知识(一)
前端·javascript·vue.js
terminal0076 小时前
浅谈useRef的使用和渲染机制
前端·react.js·面试