鸿蒙OS-通过关系型数据库实现持久化

应用数据持久化

概念:应用数据持久化,是指应用将内存中的数据通过文件或数据库的形式保存到设备上。

HarmonyOS 标准系统支持典型的存储数据形态,包括用户首选项、键值型数据库、关系型数据库

这里主要介绍关系型数据库

关系型数据库(Relational Database,RDB)是一种基于关系模型来管理数据的数据库。关系型数据库基于SQLite组件提供了一套完整的对本地数据库进行管理的机制,对外提供了一系列的增、删、改、查等接口,也可以直接运行用户输入的SQL语句来满足复杂的场景需要。不支持Worker线程。

鸿蒙os中的关系型数据库SQLite

它支持的基本数据类型:number、string、二进制类型数据、boolean。为保证插入并读取数据成功,建议一条数据不要超过2M。超出该大小,插入成功,读取失败。

该模块提供以下关系型数据库相关的常用功能:

  • RdbPredicates: 数据库中用来代表数据实体的性质、特征或者数据实体之间关系的词项,主要用来定义数据库的操作条件。
  • RdbStore:提供管理关系数据库(RDB)方法的接口。
  • ResultSet:提供用户调用关系型数据库查询接口之后返回的结果集合

关键概念

/ 关系型数据库基于SQLite
// 关键概念:
// 1:谓词(predicates):
// RdbPredicates 为构造函数,需要通过 new 关键词创建,参数为数据库表名。
// const predicates = new relationalStore.RdbPredicates(this.tableName)
// 2:结果集(ResultSet):指用户查询之后的结果集合,可以对数据进行访问。结果集提供了灵活的数据访问方式,可以更方便地拿到用户想要的数据,包含的属性:
// columnNames Array<string>   获取结果集中所有列的名称。
// columnCount number  获取结果集中的列数。
// rowCount  number  获取结果集中的行数。

数据库管理类的封装

// 包括:
// 数据库,数据库表的创建、删除、修改、查询
// 表的字段、行数和列数查询
/ /根据id删除/查询表
//数据库语句的创建---可以利用AI生成需要的表字段
//导入相关模块 
import { relationalStore, ValuesBucket } from '@kit.ArkData'
// 表的字段类型,需要继承ValueBucket接口
interface IdbTabType extends ValuesBucket {
  id: number,
  title: string,
  content: string,
  date_added: number
}

export class SQLiteDBManager {
  static store: relationalStore.RdbStore | null = null// 操作数据库的实例
  static tableName = 'PRIVACY_NOTE' //数据库表名
  // 创建数据库的语句
  static sqlCreate = `CREATE TABLE IF NOT EXISTS ${this.tableName} (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        title TEXT NOT NULL,
        content TEXT NOT NULL,
        date_added INTEGER NOT NULL
      )`

  // 获取实例
  async getStoreInstance() {
    try {
      if (SQLiteDBManager.store) { // 如果数据库实例已存在,直接返回,没有才创建实例
        return SQLiteDBManager.store
      }
      const store = await relationalStore.getRdbStore(getContext(), {
        // 创建隐私笔记的数据库实例
        name: SQLiteDBManager.tableName + '.db', // 数据库名称
        securityLevel: relationalStore.SecurityLevel.S1 // 安全等级
      })
      store.executeSql(SQLiteDBManager.sqlCreate) // 执行创建语句
      SQLiteDBManager.store = store // 存储起来方便下次直接获取
      return SQLiteDBManager.store // 返回 store 实例
    } catch (err) {
      return Promise.reject('initDB error')
    }
  }

  // 新增
  async insert(item: IdbTabType) { //item是需要插入的数据
    const store = await this.getStoreInstance()
    const rowId = await store.insert(SQLiteDBManager.tableName, item)
    return rowId > 0 ? Promise.resolve(rowId) : Promise.reject('insert error')
  }

  // 删除(传入ID则根据ID删除对应的数据)
  async delete(id: number) {
    const store = await this.getStoreInstance()
    const predicates = new relationalStore.RdbPredicates(SQLiteDBManager.tableName)
    predicates.equalTo('id', id)
    // 删除完成,返回受影响的行数
    const rowCount = await store.delete(predicates)
    return rowCount ? Promise.resolve(rowCount) : Promise.reject('delete error')
  }

  // 更新
  async update(item: IdbTabType) {
    if (!item.id) { // 如果没有 id 直接退出
      return Promise.reject('id error')
    }
    const store = await this.getStoreInstance()
    const predicates = new relationalStore.RdbPredicates(SQLiteDBManager.tableName)
    predicates.equalTo('id', item.id)
    // 更新完成,返回受影响的行数
    const rowCount = await store.update(item, predicates)
    return rowCount ? Promise.resolve(rowCount) : Promise.reject('update error')
  }

  // 查询(传入ID则根据ID查询数据)
  async query(id?: number) {
    const store = await this.getStoreInstance()
    const predicates = new relationalStore.RdbPredicates(SQLiteDBManager.tableName)
    predicates.orderByDesc('id') // 倒序排列
    if (id) { // 如果有 id,添加 id 作为查询条件
      predicates.equalTo('id', id)
    }
    const resultSet = await store.query(predicates)
    const list: IdbTabType[] = [] //声明一个list数组接收数据
    while (resultSet.goToNextRow()) { //指针进行每一行的查询
      // 获取数据
      const data: IdbTabType = {
        id: resultSet.getLong(resultSet.getColumnIndex('id')),
        title: resultSet.getString(resultSet.getColumnIndex('title')),
        content: resultSet.getString(resultSet.getColumnIndex('content')),
        date_added: resultSet.getLong(resultSet.getColumnIndex('date_added')),
      }
      list.push(data) // 追加到数组中
    }
    resultSet.close() // 循环结束,释放结果集的内存空间(性能优化)
    return list // 循环结束后,返回所有数据
  }
}

官网参考:

@ohos.data.relationalStore (关系型数据库) (openharmony.cn)icon-default.png?t=N7T8https://docs.openharmony.cn/pages/v4.1/zh-cn/application-dev/reference/apis-arkdata/js-apis-data-relationalStore.md

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值