Harmony OS Next 开发【用户首选项 Preferences 封装】

鸿蒙Next(HarmonyOS NEXT)的用户首选项(Preferences)是为应用提供的一种轻量级数据持久化解决方案,它允许开发者以键值对的形式存储和检索数据。这种机制非常适合用于保存用户的个性化设置或应用的配置信息,例如主题颜色、字体大小、是否开启夜间模式等

特点

  1. 轻量级:用户首选项主要用于存储少量的数据,不适合用来存储大量的数据集。这是因为所有数据会被加载到内存中,过多的数据可能导致内存占用过高。建议分文件存储(如 uesrFile、configFile等)
  2. 快速访问:由于数据被缓存在内存中,因此读取速度非常快
  3. 同步与异步操作:提供了同步和异步两种方式来处理数据的读写操作
  4. 支持多种数据类型:键的类型为字符串型(不能重复),值的存储数据类型包括数字型、字符型、布尔型以及这3种类型的数组类型(注: 这是一道鸿蒙基础认证考题)

Preferences 封装

对用户首选项进行封装,主要消除模版代码,提供下面几个能力

  1. 传入 fileName,获取指定的用户首选项
  2. 提供存储、删除、清空数据封装方法
  3. 提供 getConfig,使用泛型,进行数据转换
import { preferences } from '@kit.ArkData'  
import { hilog } from '@kit.PerformanceAnalysisKit'  
import { BusinessError } from '@kit.BasicServicesKit';  
  
const TAG: string = 'PreferenceUtil'  
  
const CONFIG_FILE_NAME = 'configPreference'  // 文件名
const FONT_SIZE_KEY = 'font_size_key'  // key
const IS_FIRST_OPEN = 'is_first_open'  // key
  
class PreferenceUtil {  

  private _preference?: preferences.Preferences | undefined;  
  
  getPreferenceFile(context: Context, fileName: string) {  
    this._preference = preferences.getPreferencesSync(context, { name: fileName })  
    return this  
  }
    
  // 获取首选项实例
  getConfigPreference(context: Context): PreferenceUtil {  
    return this.getPreferenceFile(context, CONFIG_FILE_NAME)  
  }
    
  // 保存信息,传入key、value
  saveConfig(key: string, value: preferences.ValueType) {  
    this._preference?.putSync(key, value)  
    this._preference?.flush((err: BusinessError) => {  
      if (err) {  
        hilog.error(0x000, TAG, 'save config failed code =' + err.code + ', message =' + err.message)  
      } else hilog.info(0x000, TAG, 'save config success')  
    })  
  }
    
  // 删除 key
  deleteKey(key: string) {  
    this._preference?.deleteSync(key)  
    this._preference?.flush((err: BusinessError) => {  
      if (err) {  
        hilog.error(0x000, TAG, 'delete config failed code =' + err.code + ', message =' + err.message)  
      } else hilog.info(0x000, TAG, 'delete config success')  
    })  
  }
    
  // 清除首选项内容
  clearPreference() {  
    this._preference?.clearSync()  
    this._preference?.flush((err: BusinessError) => {  
      if (err) {  
        hilog.error(0x000, TAG, 'clear config failed code =' + err.code + ', message =' + err.message)  
      } else hilog.info(0x000, TAG, 'clear config success')  
    })  
  }
    
  // T 泛型,返回该类型数据
  private getConfig<T>(name: string, defValue: preferences.ValueType): T {  
    return this._preference?.getSync(name, defValue) as T  
  }  

  // ====== 以下为封装的业务场景示例,可以删除
  getIsFirstOpen() {  
    return this.getConfig<boolean>(IS_FIRST_OPEN, false)  
  }  
  
  saveChangeFontSize(value: number) {  
    this.saveConfig(FONT_SIZE_KEY, value)  
  }  
  
  getChangeFontSize() {  
    return this.getConfig<number>(FONT_SIZE_KEY, 0)  
  }  
  
}  
  
export default new PreferenceUtil()

使用方式(示例)

在这里插入图片描述

// 获取 字体大小 配置
aboutToAppear() {  
  let context = this.getUIContext().getHostContext()  
  if (context) {  
	  PreferenceUtil.getConfigPreference(context)  
	  this.fontSizeOffset = PreferenceUtil.getChangeFontSize()  
  }
}  

// ... 省略代码
// 保存 字体大小 配置
Button('确认')  
  .width('156vp')  
  .height('41vp')  
  .margin({right: '16vp'})  
  .onClick(() => {  
    PreferenceUtil.saveChangeFontSize(13)  
    this.fontSizeOffset = this.currentValue  
  })

### HarmonyOS Next 开发首选项的使用与配置 #### 首选项概述 HarmonyOS Next 提供了用户首选项Preferences)作为轻量级的数据持久化方案,适用于存储少量数据,例如用户的个性化设置或应用的配置信息[^3]。这些数据以键值对形式存储,其中键为字符串类型,而值可以是数字型、字符型、布尔型及其对应的数组类型。 #### 数据存储特点 - **轻量化设计**:由于所有数据会加载至内存中,因此不推荐存储大量数据集,以免造成过高的内存消耗。 - **快速访问**:得益于内存中的缓存机制,读取速度极快。 - **同步与异步操作支持**:开发者可以选择同步或异步的方式完成数据的读写操作。 - **多种数据类型支持**:除了基本数据类型外,还支持其数组形式的存储。 #### 示例代码展示 以下是基于 HarmonyOS Next 的 Preference 使用示例: ```typescript // 导入必要的模块 import preferences from '@ohos.data.preferences'; async function saveData() { try { // 创建一个名为 'userSettings' 的偏好对象实例 const pref = await preferences.getPreferences('userSettings'); // 同步保存数据 pref.putBoolean('isDarkMode', true); pref.putString('themeColor', '#FFFFFF'); pref.putInt('fontSize', 18); // 异步保存更改到磁盘 await pref.flush(); console.log('Data saved successfully.'); } catch (error) { console.error(`Error saving data: ${error}`); } } async function readData() { try { // 获取已创建的偏好对象实例 const pref = await preferences.getPreferences('userSettings'); // 同步读取数据 const isDarkModeEnabled = pref.getBoolean('isDarkMode', false); // 默认值为false const themeColor = pref.getString('themeColor', ''); // 默认值为空字符串 const fontSize = pref.getInt('fontSize', 14); // 默认值为14 console.log(`Dark Mode Enabled: ${isDarkModeEnabled}, Theme Color: ${themeColor}, Font Size: ${fontSize}`); } catch (error) { console.error(`Error reading data: ${error}`); } } ``` 上述代码展示了如何通过 `preferences` 模块实现数据的存储与读取功能[^2]。 #### 封装优化 为了提高代码可维护性和复用性,可以通过封装简化 Preference 的调用逻辑。以下是一个简单的封装示例: ```typescript class UserPreferenceManager { private static instance: UserPreferenceManager; private prefs: any; constructor(prefName: string) { this.initPrefs(prefName); } public static getInstance(prefName: string): UserPreferenceManager { if (!UserPreferenceManager.instance) { UserPreferenceManager.instance = new UserPreferenceManager(prefName); } return UserPreferenceManager.instance; } private async initPrefs(prefName: string) { this.prefs = await preferences.getPreferences(prefName); } public async put(key: string, value: any): Promise<void> { switch (typeof value) { case 'boolean': this.prefs.putBoolean(key, value as boolean); break; case 'number': this.prefs.putInt(key, value as number); break; case 'string': this.prefs.putString(key, value as string); break; default: throw new Error('Unsupported type for preference storage.'); } await this.prefs.flush(); // 确保数据立即保存到磁盘 } public get<T>(key: string, defaultValue?: T): T | undefined { const result = this.prefs.get(key, defaultValue); return typeof result === 'undefined' ? defaultValue : result; } } const userManager = UserPreferenceManager.getInstance('userSettings'); userManager.put('isDarkMode', true).then(() => console.log('Setting updated.')); console.log(userManager.get<boolean>('isDarkMode')); // 输出true ``` 此封装类实现了单例模式并提供了通用方法来管理 Preference 存储的操作。 #### 总结 HarmonyOS Next 中的用户首选项是一种高效便捷的小规模数据存储工具,适合于保存应用程序的状态和用户偏好的简单场景。通过合理利用同步/异步 API 和自定义封装,能够显著提升开发效率和代码质量。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值