持久化

PersistentStorage 将选定的 AppStorage 属性保留在设备磁盘上。应用程序通过API,以决定哪些AppStorage属性应借助PersistentStorage持久化。UI和业务逻辑不直接访问PersistentStorage中的属性,所有属性访问都是对AppStorage的访问,AppStorage中的更改会自动同步到PersistentStorage。

PersistentStorage和AppStorage中的属性建立双向同步。应用开发通常通过AppStorage访问PersistentStorage,另外还有一些接口可以用于管理持久化属性,但是业务逻辑始终是通过AppStorage获取和设置属性的。

限制条件

PersistentStorage允许的类型和值有:

  • number, string, boolean, enum 等简单类型
  • 可以被 JSON.stringify()和JSON.parse() 重构的对象。例如Date, Map, Set等内置类型则不支持,以及对象的属性方法不支持持久化。

PersistentStorage 不允许的类型和值有:

  • 不支持嵌套对象(对象数组,对象的属性是对象等)。因为目前框架无法检测AppStorage中嵌套对象(包括数组)值的变化,所以无法写回到PersistentStorage中。
  • 不支持 undefined 和 null 。

持久化数据是一个相对缓慢的操作,应用程序应避免以下情况

  • 持久化大型数据集。
  • 持久化经常变化的变量。

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

如果开发者需要存储大量的数据,建议使用数据库 api。

PersistentStorage和UI实例相关联,持久化操作需要在UI实例初始化成功后(即loadContent传入的回调被调用时)才可以被调用,早于该时机调用会导致持久化失败。

对比:

首选项:首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询

应用首选项的持久化文件保存在应用沙箱内部,适用于存储小型配置项数据

AppStorage-页面内使用:

  • 初始化: AppStorage.SetOrCreate(key,value)
  • 单向 @StorageProp(‘user’) 组件内可变
  • 双向 @StorageLink(‘user’) 全局均可变

  PersistentStorage.PersistProp(‘属性名’, 值)

        后续直接通过 AppStorage 的 Api 来获取并修改即可,AppStorage 的修改会自动同步到PersistentStorage中

LocalStorage:是页面级的 UI 状态存储。可以在页面内或 UIAbility 实例内共享状态,通常用于在页面间传递数据。它是内存中的非持久化存储,应用程序决定其生命周期,当没有引用时会被垃圾回收。
AppStorage:由 UI 框架在应用程序启动时创建,为应用程序 UI 状态属性提供中央存储。它可以在应用程序的不同页面和组件之间共享数据。
PersistentStorage:用于持久化存储 UI 状态。它通常与AppStorage配合使用,将AppStorage中选择的数据写入磁盘,以确保这些属性在应用程序重新启动时的值与应用程序关闭时的值相同。

  • 数据库是一种结构化的数据存储解决方案,采用表格的形式存储数据,支持复杂的查询和关联操作。
  • 数据库适用于存储大量数据,并且需要进行复杂查询或多表关联的场景。

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

数据库的使用:

使用:

  1. 通过 relationalStore.getRdbStore 创建数据库 store 实例。
  2. 执行 store.executeSql 执行创建数据库的语句。
增删改查:
 const store = await this.getStoreInstance()
  return store.insert(this.tableName, item)

 const store = await this.getStoreInstance()
  const predicates = new relationalStore.RdbPredicates(this.tableName)
  const resultSet = await store.query(predicates)

 const store = await this.getStoreInstance()
  const predicates = new relationalStore.RdbPredicates(this.tableName)
  predicates.in('id', ids)
  // 删除完成,返回受影响的行数
  return store.delete(predicates)

评论

  1. 博主
    3 月前
    2024-11-25 22:43:53

    111111111111

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇