【鸿蒙HarmonyOS NEXT】数据存储之关系型数据库RDS
一、环境说明
-
DevEco Studio 版本:
-
API版本:
以12为主
二、关系型数据库RDS介绍
1. RDS关系型数据库简介:
关系型数据库(Relational Database,RDB)是一种基于关系模型来管理数据的数据库。关系型数据库基于SQLite组件提供了一套完整的对本地数据库进行管理的机制,对外提供了一系列的增、删、改、查等接口,也可以直接运行用户输入的SQL语句来满足复杂的场景需要。支持通过ResultSet.getSendableRow方法获取Sendable数据,进行跨线程传递。
为保证插入并读取数据成功,建议一条数据不要超过2M。超出该大小,插入成功,读取失败。
大数据量场景下查询数据可能会导致耗时长甚至应用卡死,建议如下:
- 单次查询数据量不超过5000条。
- 在TaskPool中查询。
- 拼接SQL语句尽量简洁。
- 合理地分批次查询。
- 该模块提供以下关系型数据库相关的常用功能:
- RdbPredicates: 数据库中用来代表数据实体的性质、特征或者数据实体之间关系的词项,主要用来定义数据库的操作条件。
- RdbStore:提供管理关系数据库(RDB)方法的接口。
- ResultSet:提供用户调用关系型数据库查询接口之后返回的结果集合。
2. 基本概念
-
谓词:数据库中用来代表数据实体的性质、特征或者数据实体之间关系的词项,主要用来定义数- 据库的操作条件。
-
结果集:指用户查询之后的结果集合,可以对数据进行访问。结果集提供了灵活的数据访问方式,可以更方便地拿到用户想要的数据。
3. RDS应用场景:
关系型数据库基于SQLite组件,适用于存储包含复杂关系数据的场景,比如一个班级的学生信息,需要包括姓名、学号、各科成绩等,又或者公司的雇员信息,需要包括姓名、工号、职位等,由于数据之间有较强的对应关系,复杂程度比键值型数据更高,此时需要使用关系型数据库来持久化保存数据。
4. 运作机制介绍:
关系型数据库对应用提供通用的操作接口,底层使用SQLite作为持久化存储引擎,支持SQLite具有的数据库特性,包括但不限于事务、索引、视图、触发器、外键、参数化查询和预编译SQL语句。
三、示例代码加以说明
沿用【鸿蒙HarmonyOS NEXT】页面之间相互传递参数博文中的代码,进行测试。
使用场景模拟:将用户登录的信息存储到关系型数据库中,并将RDS中的数据库抽取展示出来。
代码改写如下:
-
新增一个名为
model
的目录
-
在
model
目录下创建名称为UserInfo
的Ark TS文件,用于封装用户信息表的数据,代码如下:/** * 构造数据库表CLIENT_USER对应的实体类 */ export default class UserInfo { public id: number public account: string public password: string constructor(id: number, account: string, password: string) { this.id = id; this.account = account; this.password = password; } }
-
LoginPage
完整代码如下:import { router } from '@kit.ArkUI'; // 引入Context相关 import { common } from '@kit.AbilityKit'; // 引入RDB相关 import { relationalStore } from '@kit.ArkData'; import { BusinessError } from '@kit.BasicServicesKit'; @Preview @Entry @Component struct LoginPage { @State message: string = '登录页'; @State btnMsg: string = '登录'; @State account: string = ''; // 账号状态变量 @State password: string = ''; // 密码状态变量 // 获取Context private context = getContext(this) as common.UIAbilityContext; // 定义RdbStore private rdbStore: relationalStore.RdbStore | undefined = undefined; aboutToAppear(): void { // 构造StoreConfig对象 const STORE_CONFIG: relationalStore.StoreConfig = { name: 'RdbTest.db', // 数据库文件名 securityLevel: relationalStore.SecurityLevel.S1, // 数据库安全级别 encrypt: false, // 可选参数,指定数据库是否加密,默认不加密 customDir: 'customDir/subCustomDir', // 可选参数,数据库自定义路径。数据库将在如下的目录结构中被创建:context.databaseDir + '/rdb/' + customDir,其中context.databaseDir是应用沙箱对应的路径,'/rdb/'表示创建的是关系型数据库,customDir表示自定义的路径。当此参数不填时,默认在本应用沙箱目录下创建RdbStore实例。 isReadOnly: false // 可选参数,指定数据库是否以只读方式打开。该参数默认为false,表示数据库可读可写。该参数为true时,只允许从数据库读取数据,不允许对数据库进行写操作,否则会返回错误码801。 }; // 判断数据库版本,如果不匹配则需进行升降级操作 // 默认数据库版本为0,表结构:CLIENT_USER (ID INTEGER PRIMARY KEY AUTOINCREMENT, ACCOUNT TEXT NOT NULL, PASSWORD TEXT NOT NULL)' const SQL_CREATE_TABLE = 'CREATE TABLE IF NOT EXISTS CLIENT_USER (ID INTEGER PRIMARY KEY AUTOINCREMENT, ACCOUNT TEXT NOT NULL, PASSWORD TEXT NOT NULL)'; // 建表Sql语句 // 获得一个相关的RdbStore,操作关系型数据库,用户可以根据自己的需求配置RdbStore的参数,然后通过RdbStore调用相关接口可以执行相关的数据操作,使用callback异步回调。 relationalStore.getRdbStore(this.context, STORE_CONFIG, (err, store) => { if (err) { console.error(`At LoginPage Failed to get RdbStore. Code:${ err.code}, message:${ err.message}`); return; } console.info('At LoginPage Succeeded in getting RdbStore.'); // 当数据库创建时,数据库默认版本为0 if (store.version === 0) { store.