【鸿蒙HarmonyOS NEXT】数据存储之关系型数据库RDS

【鸿蒙HarmonyOS NEXT】数据存储之关系型数据库RDS

一、环境说明

  1. DevEco Studio 版本:
    在这里插入图片描述

  2. API版本:以12为主
    在这里插入图片描述

二、关系型数据库RDS介绍

1. RDS关系型数据库简介

关系型数据库(Relational Database,RDB)是一种基于关系模型来管理数据的数据库。关系型数据库基于SQLite组件提供了一套完整的对本地数据库进行管理的机制,对外提供了一系列的增、删、改、查等接口,也可以直接运行用户输入的SQL语句来满足复杂的场景需要。支持通过ResultSet.getSendableRow方法获取Sendable数据,进行跨线程传递。
为保证插入并读取数据成功,建议一条数据不要超过2M。超出该大小,插入成功,读取失败。
大数据量场景下查询数据可能会导致耗时长甚至应用卡死,建议如下:

  1. 单次查询数据量不超过5000条。
  • 在TaskPool中查询。
  • 拼接SQL语句尽量简洁。
  • 合理地分批次查询。
  • 该模块提供以下关系型数据库相关的常用功能:
  1. RdbPredicates: 数据库中用来代表数据实体的性质、特征或者数据实体之间关系的词项,主要用来定义数据库的操作条件。
  2. RdbStore:提供管理关系数据库(RDB)方法的接口。
  3. ResultSet:提供用户调用关系型数据库查询接口之后返回的结果集合。

2. 基本概念

  • 谓词:数据库中用来代表数据实体的性质、特征或者数据实体之间关系的词项,主要用来定义数- 据库的操作条件。

  • 结果集:指用户查询之后的结果集合,可以对数据进行访问。结果集提供了灵活的数据访问方式,可以更方便地拿到用户想要的数据。

3. RDS应用场景:

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

4. 运作机制介绍:

关系型数据库对应用提供通用的操作接口,底层使用SQLite作为持久化存储引擎,支持SQLite具有的数据库特性,包括但不限于事务、索引、视图、触发器、外键、参数化查询和预编译SQL语句。

在这里插入图片描述

三、示例代码加以说明

沿用【鸿蒙HarmonyOS NEXT】页面之间相互传递参数博文中的代码,进行测试。
使用场景模拟将用户登录的信息存储到关系型数据库中,并将RDS中的数据库抽取展示出来。

代码改写如下:

  1. 新增一个名为model的目录
    在这里插入图片描述

  2. 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;
      }
    }
    
  3. 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.
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT喂嘟盲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值