HarmonyOS 鸿蒙Next数据持久化之用户首选项

HarmonyOS 鸿蒙Next数据持久化之用户首选项

指南:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/data-persistence-by-preferences

内存中的数据可以写道硬盘里面,这个过程就是数据持久化。

用户首选项提供了一个全局存储数据的能力,这个数据存储在内存中的时候,你可以选择持久化数据到硬盘。如果从磁盘里面读取出来。一次性加载数据到内存。

适合存储一些项目中全局的变量。比如全局主题颜色、全局字体大小等等。

不适合存储大量产品、订单、日志等等。

Preferences 与 AppStorage 的主要区别?

一、定位与作用域

AppStorage

  • 是应用级的全局状态管理存储,由 UI 框架在应用启动时自动创建的单例对象。
  • 作用范围:应用内所有 UIAbility 和页面均可访问,支持双向数据绑定,适合存储全局 UI 状态属性。
  • 默认非持久化,关闭应用后数据清空;需通过 PersistentStorage 关联才能持久化到本地。

Preferences

  • 是轻量级的持久化键值存储,通过 ohos.data.preferences API 操作,直接与本地磁盘交互。
  • 作用范围:存储用户个性化配置(如字体大小、夜间模式开关等),数据全局可访问且持久化到沙箱文件。

二、数据管理与性能

特性 AppStorage Preferences
持久化机制 需依赖 PersistentStorage 同步写入磁盘 直接异步或同步写入磁盘
数据类型 支持复杂对象(需手动序列化) 仅支持基础类型(string/number/boolean)及其数组
性能影响 同步操作可能阻塞 UI 线程 全量加载到内存,高频读取效率高
数据限制 建议单数据 ≤2KB Key ≤1024 字节,Value ≤16MB

三、典型使用场景

AppStorage

适用于全局 UI 状态共享(如主题切换、多页面交互参数),且需通过 PersistentStorage 实现重启后状态恢复。

// 配合 PersistentStorage 持久化
PersistentStorage.PersistProp('theme', 'light'); 
AppStorage.setOrCreate('theme', 'light');

Preferences

适用于用户偏好设置(如音量、语言选项)、轻量配置数据持久化,无需跨组件状态同步。

// 首选项操作示例
let prefs = preferences.getPreferencesSync(context, 'settings'); 
prefs.putSync('volume', 80).flushSync();

四、核心差异总结

维度 AppStorage Preferences
持久化 需额外依赖 PersistentStorage 原生支持持久化
数据同步 支持跨页面/组件双向绑定 需手动订阅数据变化
适用场景 全局 UI 状态管理 用户配置存储

封装代码:

import { preferences } from "@kit.ArkData";
import { Context } from "@kit.AbilityKit";
import { BusinessError } from "@kit.BasicServicesKit";

export class PreferencesUtil{
  private dataPreferences:preferences.Preferences | null=null

  /**
   * 初始化preferences 对象
   * @param context
   * @param storeName
   */
  init(context:Context,storeName:string){
    let options: preferences.Options={name:storeName}
    this.dataPreferences=preferences.getPreferencesSync(context,options)

    let observer =(key:string)=>{
      console.info(`the key:${key} changed`)
      // 持久化到硬盘
      (this.dataPreferences as preferences.Preferences).flush((err:BusinessError)=>{
        if(err){
          console.error(`failed to flush ,Code :${err.code} ,message :${err.message}`)
          return
        }
        console.info('Succeeded in flushing')
      })
    }
    // 给数据设置监听效果
    this.dataPreferences.on('change',observer)
  }

  insert(key:string,value:string){
    if(this.dataPreferences){
      if(this.dataPreferences.hasSync(key)){
        console.log(`当前已经存在key${key}`)
      }else{
        this.dataPreferences.putSync(key,value)
        console.log(`添加${key}成功`)
      }
    }
  }
  readDate(key:string,value?:string){
    if(this.dataPreferences){
      let val=this.dataPreferences.getSync(key,value?value:'default')
      console.log(`The ${key} value is ${val}`)
      return val
    }else{
      return '查询不到'
    }
  }

  delData(key:string){
    if(this.dataPreferences){
      this.dataPreferences.deleteSync(key)
    }
  }
}

const preferencesUtil= new PreferencesUtil()
export  {preferencesUtil}

Abiltuty中

onWindowStageCreate(windowStage: window.WindowStage): void {
  // 初始化preferences
  preferencesUtil.init(this.context,'myStore')
  preferencesUtil.insert('theme','pink')
}

页面中

Button('主题设置blue').onClick((event:ClickEvent)=>{
  preferencesUtil.insert('theme','blue')
})

Button('获取主题').onClick((event:ClickEvent)=>{
  const result=preferencesUtil.readData('theme')
  console.log(`result:${result}`)
})

更多关于HarmonyOS 鸿蒙Next数据持久化之用户首选项的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

HarmonyOS鸿蒙Next中的用户首选项(Preferences)是一种轻量级的数据持久化方案,适用于存储简单的键值对数据。它基于XML文件存储,支持多种数据类型,如字符串、整型、布尔值等。用户首选项通过Preferences类进行操作,提供putgetdelete等方法。数据存储在应用沙箱内,确保安全性和隔离性。用户首选项适用于存储用户设置、应用配置等小规模数据,不适合存储大量或复杂数据。

更多关于HarmonyOS 鸿蒙Next数据持久化之用户首选项的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,Preferences和AppStorage是两种不同的数据存储方案,主要区别如下:

  1. 持久化机制:
  • Preferences原生支持持久化,数据直接写入磁盘
  • AppStorage默认非持久化,需通过PersistentStorage实现持久化
  1. 数据类型:
  • Preferences仅支持基础类型(string/number/boolean)及其数组
  • AppStorage支持复杂对象(需手动序列化)
  1. 使用场景:
  • Preferences适合存储用户偏好设置(如音量、语言选项)
  • AppStorage适合全局UI状态管理(如主题切换)
  1. 性能特点:
  • Preferences全量加载到内存,读取效率高
  • AppStorage同步操作可能阻塞UI线程

示例代码展示了Preferences的基本用法,包括初始化、插入、读取和删除数据。关键点:

  • 使用preferences.getPreferencesSync获取Preferences实例
  • putSync/flushSync用于同步写入数据
  • 可通过on方法监听数据变化

对于轻量级配置数据存储,Preferences是更合适的选择,而需要跨组件共享的UI状态则更适合使用AppStorage。

回到顶部