当前位置: 首页 > news >正文

鸿蒙笔记--存储

    这一节了解一下鸿蒙中常用存储API,主要有LocalStorage ,AppStorage,PersistentStorage,LocalStorage 是一种页面级UI状态存储机制,主要用于在UIAbility内和页面间共享状态数据。通过使用特定的装饰器,LocalStorage能够实现组件内部变量与LocalStorage中属性的单向或双向同步。

LocalStorage的装饰器器
@LocalStorageProp:此装饰器用于建立组件内部变量与LocalStorage中指定属性的单向同步关系。当LocalStorage中的属性变化时,会同步到组件的变量,但本地修改不会同步回LocalStorage。
@LocalStorageLink:此装饰器用于建立组件内部变量与LocalStorage中指定属性的双向同步关系。本地和LocalStorage中的修改都会互相同步。

栗子:

EntryAbility.ts import UIAbility from '@ohos.app.ability.UIAbility';
import hilog from '@ohos.hilog';
import window from '@ohos.window';export default class EntryAbility extends UIAbility {onCreate(want, launchParam) {hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');}onDestroy() {hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');}storage = new LocalStorage({user: {name: 'jack',age: 20}})onWindowStageCreate(windowStage: window.WindowStage) {// Main window is created, set main page for this abilityhilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');windowStage.loadContent('pages/Index', this.storage, (err, data) => {if (err.code) {hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');return;}hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? '');});}onWindowStageDestroy() {// Main window is destroyed, release UI related resourceshilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');}onForeground() {// Ability has brought to foregroundhilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground');}onBackground() {// Ability has back to backgroundhilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground');}
}

Index.ets

import { User } from '../models'const storage = LocalStorage.GetShared()@Entry(storage)
@Component
struct Index {@LocalStorageProp('user')user: User = {}build() {Column({ space: 30 }) {Text(this.user.name + this.user.age).onClick(() => {this.user.age ++})Child()Navigator({target: 'pages/OtherPage',}){Text('Jump Other Page')}}.height('100%')}
}@Component
struct Child {@LocalStorageLink('user')user: User = {}build() {Text(this.user.name + this.user.age).onClick(() => {this.user.age ++})}
}

OtherPage.ets 

import { User } from '../models'const storage = LocalStorage.GetShared()@Entry(storage)
@Component
struct OtherPage {@LocalStorageLink('user')user: User = {}build() {Column(){Text(' Other Page ')Text(this.user.name + this.user.age).onClick(() => {this.user.age ++})}}
}

bean类:

Index.ets

export class User {name?: stringage?: number
}

AppStorage为应用程序的UI状态属性提供中央存储,并且由UI框架在应用程序启动时创建。与LocalStorage不同,LocalStorage是页面级的存储,通常用于单个页面或页面间的数据共享,而AppStorage则是全局的状态共享,相当于整个应用的“中枢”。

AppStorage的装饰器
@StorageProp:此装饰器用于建立组件内部变量与AppStorage中指定属性的单向同步关系。当AppStorage中的属性变化时,会同步到组件的变量,但本地修改不会同步回AppStorage。
@StorageLink:此装饰器用于建立组件内部变量与AppStorage中指定属性的双向同步关系。本地和AppStorage中的修改都会互相同步。

栗子:

Index.etsimport promptAction from '@ohos.promptAction'
import { User } from '../models'
AppStorage.SetOrCreate('user', { name: 'jack', age: 16 })@Entry
@Component
struct Index {@StorageLink('user')user: User = {}build() {Column({ space: 15 }) {Text(this.user.name + this.user.age).onClick(() => {this.user.age ++})Divider()Child()Divider()ChildB()}.height('100%').width('100%').justifyContent(FlexAlign.Center)}
}@Component
struct Child {@StorageLink('user')user: User = {}build() {Text(this.user.name + this.user.age).onClick(() => {this.user.age ++})}
}@Component
struct ChildB {build() {Column(){Text('获取 AppStorage').onClick(() => {const user = AppStorage.Get<User>('user')promptAction.showToast({ message: user.name + user.age })})Text('修改 AppStorage').onClick(() => {AppStorage.Set<User>('user', { name: 'tom', age: 20 })})Text('Link 修改 AppStorage').onClick(() => {const link: SubscribedAbstractProperty<User> = AppStorage.Link('user')// promptAction.showToast({ message: link.get().name + link.get().age })link.set({name: link.get().name,age: link.get().age + 1})})}}
}

         PersistentStorage 是一个用于实现数据持久化的存储机制,其主要作用是确保选定的 AppStorage 属性在应用程序重新启动时的值与应用程序关闭时的值相同。PersistentStorage 将选定的 AppStorage 属性保留在设备磁盘上,通过 API 来决定哪些 AppStorage 属性应借助 PersistentStorage 进行持久化。所有属性访问都是对 AppStorage 的访问,AppStorage 中的更改会自动同步到 PersistentStorage。

PersistentStorage的装饰器
@persistProp:此装饰器用于将指定的 AppStorage 属性持久化到设备磁盘上。例如,使用 PersistentStorage.persistProp('aProp', 47) 将 'aProp' 属性持久化。
@StorageLink:此装饰器用于建立组件内部变量与 AppStorage 中指定属性的双向同步关系,所有同步也会反映到 PersistentStorage 中。

栗子:

Index.ets

import { User } from '../models'
PersistentStorage.PersistProp('count', 100)
PersistentStorage.PersistProp('user', `{ "name": "jack", "age": 17 }`)@Entry
@Component
struct Index {@StorageLink('count')count: number = 0@StorageLink('user')userJson: string = ''@Stateuser: User = JSON.parse(this.userJson)build() {Column({ space: 15 }) {Text(this.count.toString()).onClick(() => {this.count ++})Text(this.user.name + this.user.age).onClick(() => {this.user.age ++// this.userJson = JSON.stringify(this.user)AppStorage.Set('user', JSON.stringify(this.user))})Divider()ChildA()}.height('100%').width('100%').justifyContent(FlexAlign.Center)}
}@Component
struct ChildA {@StorageLink('count')count: number = 0@StorageLink('user')userJson: string = ''build() {Column(){Text(this.count.toString()).onClick(() => {this.count ++})Text(this.userJson)}}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Matplotlib : Python 的绘图库
  • 华清数据结构day5 24-7-22
  • 派可数据 助力制造企业数字化生产管理新能力提升
  • 每天五分钟深度学习:向量化方式完成逻辑回归m个样本的前向传播
  • Spark 解析嵌套的 JSON 文件
  • Linux取消U盘自动挂载
  • 5G智能防爆手持终端在石油化工行业中扮演着什么角色?
  • 【Android】碎片—动态添加、创建Fragment生命周期、通信
  • 阿里云ubuntu宝塔面板部署uni-app-flask-websocket前后端项目
  • oracle使用backup as copy方式迁移数据文件
  • Java 中集合的练习
  • 跟李沐学AI:池化层
  • shell-awk文本处理工具
  • 边界网关IPSEC VPN实验
  • Godot游戏制作 05收集物品
  • 【刷算法】求1+2+3+...+n
  • 2017 年终总结 —— 在路上
  • co模块的前端实现
  • JAVA SE 6 GC调优笔记
  • linux学习笔记
  • Nodejs和JavaWeb协助开发
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • Rancher-k8s加速安装文档
  • SpiderData 2019年2月25日 DApp数据排行榜
  • 彻底搞懂浏览器Event-loop
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 使用Swoole加速Laravel(正式环境中)
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 追踪解析 FutureTask 源码
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • !$boo在php中什么意思,php前戏
  • #if 1...#endif
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (14)Hive调优——合并小文件
  • (160)时序收敛--->(10)时序收敛十
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (三十)Flask之wtforms库【剖析源码上篇】
  • (转)母版页和相对路径
  • ./和../以及/和~之间的区别
  • .NET BackgroundWorker
  • .Net Core中Quartz的使用方法
  • .net打印*三角形
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • @DataRedisTest测试redis从未如此丝滑
  • @ModelAttribute注解使用
  • @NestedConfigurationProperty 注解用法
  • @Responsebody与@RequestBody
  • [].slice.call()将类数组转化为真正的数组
  • [012-1].第12节:Mysql的配置文件的使用
  • [2013][note]通过石墨烯调谐用于开关、传感的动态可重构Fano超——
  • [AMQP Connection 127.0.0.1:5672] An unexpected connection driver error occured