HarmonyOS5/ArkTs 两句话带你零门槛入门持久化存储(面试加分项)

我看好多博客都是copy官网API的,太官方啦!看这里吧,都是面试加分项

一、PersistentStorage

参考官网文档
1, 优点:

  • persistentStorage适用于与 UI 状态联动的轻量的数据场景,比如主题、APP设置等这些数据场景
  • 它与 AppStorage绑定后,数据是自动双向同步。
  • persistentStorage 是 基于 Preferences 封装的高级 API,它实现了AppStorage 状态的自动同步。AppStorage数据发生变更时,通过监听状态变更自动触发 preferences.put() 和 preferences.get() 操作。这种设计既保留了 Preferences的轻量特性,又提供了响应式编程的便利性。
  • 支持 加密存储(SecurityLevel.S1/S2/S3/S4)和跨设备查询(通过分布式框架)。

2, 性能上:

  • 持久化变量最好是小于2kb的数据
  • 不建议进行大量的数据持久化,因为PersistentStorage写入磁盘的操作是同步的,大量的数据本地化读写会同步在UI线程中执行,影响UI渲染性能
  • 高频操作可能有性能损耗。

3,必须储备点:

  • persistentStorage 不支持嵌套对象监听,Preferences 的 put() 方法需完整替换键值,直接修改嵌套属性不会触发装饰器监听的引用变更。需用新对象覆盖原值

4,代码

//初始化
PersistentStorage.persistProp('aProp', 47);
//加密
persistentStorage.create(context, {
  securityLevel: dataPreferences.SecurityLevel.S4 // 最高等级加密
});

二、Preference

参考官网文档

1, 优点:

  • Preferences是Key-Value 形式的数据结构,基于 XML 文件存储,API 简单,线程安全,适用于非UI状态类配置的数据存储
  • 支持 加密存储(SecurityLevel.S1/S2/S3/S4)和 跨设备查询(通过分布式框架)。

2, 性能上:

  • key 长度不超过1KB,value长度不超过16MB
  • 存储的数据不超过一万条
  • Preferences中的数据会被缓存在内存中,因此它可以获取数据更快

3, 代码:

import dataPreferences from '@ohos.data.preferences';
// 获取 Preferences 实例
let preferences = await dataPreferences.getPreferences(context, 'myprefs');
// 存数据
await preferences.put('key', 'value');
await preferences.flush(); // 提交更改
// 取数据
let value = await preferences.get('key', 'defaultValue');

三RelationalStorage

RelationalStorage参考文档
1, 优点:

  • 适合存储大量的或者复杂本地数据,并且具备复杂的数据过滤处理和具备查询性能要求
  • 查询用到复杂的过滤并有查询性能的要求

2,特点

  • ● 基于 SQLite 封装,提供 ORM(对象关系映射) 风格
    API便于对数据的简单操作。提供了对数据的复杂的查询语句和数据过滤,适合需要频繁查询和统计的应用场景。

  • 提供了createTransaction()对事务的ACID(原子性、一致性、隔离性、持久性)的支持。事务类型有DEFERRED、IMMEDIATE和EXCLUSIVE,默认为DEFERRED。
    deferred:创建事务的时候不会真正开始事务,只有在事务对象中进行第一次的读或写操作才会开始事务
    immediate:创建时会真正开始一个写事务;如果有别的写事务未提交,则会创建失败
    exclusive:该类型的事务在WAL模式下和IMMEDIATE相同,但在其他日志模式下能够防止事务期间有其他连接读取数据库

  • 通过其内部机制(如索引、缓存等)能够提供更高效的数据处理能力。

3,性能上:

  • 单次查询数据量不超过5000条

4,代码:

import { relationalStore } from '@kit.ArkData'


export interface InterviewAudioItem extends relationalStore.ValuesBucket {
  id: number | null
  // 用户id
  user_id: string
  name: string
  path: string
  duration: number
  size: number
  create_time: number
}


export class AudioDB {
  store: relationalStore.RdbStore | null = null
  tableName: string = 'interview_audio'

  // 初始化数据库
  async initStore() {
    // 我用上下文 一般只有两个玩法
    // 页面中  getContext()
    // 封装类中   AppStorage.get('context')
    const ctx = AppStorage.get<Context>('context')
    if (ctx) {
      const store = await relationalStore.getRdbStore(ctx, {
        name: 'interview_audio.db',
        securityLevel: relationalStore.SecurityLevel.S1
      })
      const sql = `
        CREATE TABLE IF NOT EXISTS ${this.tableName} (
          id INTEGER PRIMARY KEY AUTOINCREMENT,
          user_id TEXT NOT NULL,
          name TEXT NOT NULL,
          path TEXT NOT NULL,
          duration INTEGER NOT NULL,
          size INTEGER NOT NULL,
          create_time INTEGER NOT NULL
        )
      `
      await store.executeSql(sql)
      this.store = store
    }
  }

  // 添加
  async insert(item: InterviewAudioItem) {
    const rowId = await this.store?.insert(this.tableName, item)
    if (rowId === undefined || rowId === -1) {
      // 拿到了rowId就是插入成功  否则就是失败
      return Promise.reject('insert fail')
    } else {
      return Promise.resolve()
    }
  }

  // 删除
  async delete(id: number) {
    const predicates = new relationalStore.RdbPredicates(this.tableName)
    predicates.equalTo('id', id)
    const rowCount = await this.store?.delete(predicates)
    if (rowCount === undefined || rowCount <= 0) {
      // 受影响的行数为空或者小于0  删除失败
      return Promise.reject('delete fail')
    } else {
      return Promise.resolve()
    }
  }

  // 修改  update(更新后的数据)
  async update(item: InterviewAudioItem) {
    const predicates = new relationalStore.RdbPredicates(this.tableName)
    predicates.equalTo('id', item.id)
    const rowCount = await this.store?.update(item, predicates)
    if (rowCount === undefined || rowCount <= 0) {
      // 受影响的行数为空或者小于0  删除失败
      return Promise.reject('update fail')
    } else {
      return Promise.resolve()
    }
  }

  // 查询用户
  async query(userId: string) {
    const predicates = new relationalStore.RdbPredicates(this.tableName)
    predicates.equalTo('user_id', userId) // 一个用户会录很多音 会有很多数据
    const resultSet = await this.store?.query(predicates)
    if (!resultSet) {
      return Promise.reject('query fail')
    }
    const list: InterviewAudioItem[] = []
    while (resultSet.goToNextRow()) {
      list.push({
        id: resultSet.getLong(resultSet.getColumnIndex('id')),
        user_id: resultSet.getString(resultSet.getColumnIndex('user_id')),
        name: resultSet.getString(resultSet.getColumnIndex('name')),
        path: resultSet.getString(resultSet.getColumnIndex('path')),
        duration: resultSet.getLong(resultSet.getColumnIndex('duration')),
        size: resultSet.getLong(resultSet.getColumnIndex('size')),
        create_time: resultSet.getLong(resultSet.getColumnIndex('create_time'))
      })
    }
    resultSet.close() // 结果集 不用了  记得关闭
    return Promise.resolve(list) // 查出来的数据在这里返回了
  }
}

export const audioDB = new AudioDB()

记得点击收藏,会持续完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值