继前面两篇首选项数据和键值对数据库,本文介绍HarmonyOS数据管理的第三种数据库形式-关系型数据库
介绍
关系型数据库对应用提供通用的操作接口,底层使用SQLite作为持久化存储引擎,
支持SQLite具有的数据库特性,包括但不限于事务、索引、视图、触发器、外键、参数化查询和预编译SQL语句

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

关系型数据库的约束限制
-
系统默认日志方式是WAL(Write Ahead Log)模式,系统默认落盘方式是FULL模式
-
数据库中有4个读连接和1个写连接,线程获取到空闲读连接 时,即可进行读取操作。当没有空闲读连接且有空闲写连接时,会将写连接当做读连接来使用。
-
为保证数据的准确性,数据库同一时间只能支持一个写操作。
-
当应用被卸载完成后,设备上的相关数据库文件及临时文件会被自动清除
-
ArkTS侧支持的基本数据类型: number 、string 、二进制类型数据、 boolean
-
为保证插入并读取数据成功,建议一条数据不要超过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名