鸿蒙笔记--存储

这一节了解一下鸿蒙中常用存储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)
    }
  }
}
相关推荐
听忆.15 分钟前
手机屏幕上进行OCR识别方案
笔记
Selina K1 小时前
shell脚本知识点记录
笔记·shell
1 小时前
开源竞争-数据驱动成长-11/05-大专生的思考
人工智能·笔记·学习·算法·机器学习
霍格沃兹测试开发学社测试人社区2 小时前
软件测试学习笔记丨Flask操作数据库-数据库和表的管理
软件测试·笔记·测试开发·学习·flask
幸运超级加倍~2 小时前
软件设计师-上午题-16 算法(4-5分)
笔记·算法
王俊山IT2 小时前
C++学习笔记----10、模块、头文件及各种主题(一)---- 模块(5)
开发语言·c++·笔记·学习
Yawesh_best3 小时前
思源笔记轻松连接本地Ollama大语言模型,开启AI写作新体验!
笔记·语言模型·ai写作
CXDNW5 小时前
【网络面试篇】HTTP(2)(笔记)——http、https、http1.1、http2.0
网络·笔记·http·面试·https·http2.0
使者大牙5 小时前
【大语言模型学习笔记】第一篇:LLM大规模语言模型介绍
笔记·学习·语言模型
ssf-yasuo5 小时前
SPIRE: Semantic Prompt-Driven Image Restoration 论文阅读笔记
论文阅读·笔记·prompt