鸿蒙笔记--存储

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

LocalStorage的装饰器器

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

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

栗子:

TypeScript 复制代码
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 ability
    hilog.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 resources
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');
  }

  onForeground() {
    // Ability has brought to foreground
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground');
  }

  onBackground() {
    // Ability has back to background
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground');
  }
}

Index.ets

TypeScript 复制代码
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

TypeScript 复制代码
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

TypeScript 复制代码
export class User {
  name?: string
  age?: number
}

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

AppStorage的装饰器

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

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

栗子:

TypeScript 复制代码
Index.ets

import 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

TypeScript 复制代码
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 = ''

  @State
  user: 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)
    }
  }
}
相关推荐
Rinai_R42 分钟前
计算机组成原理的学习笔记(7)-- 存储器·其二 容量扩展/多模块存储系统/外存/Cache/虚拟存储器
笔记·物联网·学习
吃着火锅x唱着歌42 分钟前
PHP7内核剖析 学习笔记 第四章 内存管理(1)
android·笔记·学习
ragnwang1 小时前
C++ Eigen常见的高级用法 [学习笔记]
c++·笔记·学习
胡西风_foxww1 小时前
【es6复习笔记】rest参数(7)
前端·笔记·es6·参数·rest
胡西风_foxww5 小时前
【es6复习笔记】函数参数的默认值(6)
javascript·笔记·es6·参数·函数·默认值
胡西风_foxww5 小时前
【es6复习笔记】生成器(11)
javascript·笔记·es6·实例·生成器·函数·gen
waterme1onY5 小时前
Spring AOP 中记录日志
java·开发语言·笔记·后端
2401_879103685 小时前
24.12.25 AOP
java·开发语言·笔记
索然无味io6 小时前
跨站请求伪造之基本介绍
前端·笔记·学习·web安全·网络安全·php
kikikidult6 小时前
Ubuntu20.04安装openMVS<成功>.colmap<成功>和openMVG<失败(已成功)>
笔记·学习