鸿蒙开发之首选项封装

620 阅读3分钟

概述

用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。 数据存储形式为键值对,键的类型为字符串型,值的存储数据类型包括数字型、字符型、布尔型以及这3种类型的数组类型。

首选项的特点

  1. 轻量级数据管理能力:
    • 鸿蒙的用户首选项为应用提供了Key-Value键值型的数据处理能力,支持应用持久化轻量级数据。
    • 适用于保存用户的个性化设置,如屏幕亮度、是否开启夜间模式等。
    • 由于数据被缓存在内存中,读取速度非常快,提升了用户体验。
  2. 内存管理效率:
    • 虽然用户首选项会随着存放的数据量增多而导致应用占用的内存增大,但由于其设计初衷就是轻量级数据的管 理,因此建议存储的数据不超过一万条,避免了过大的内存开销。
  3. 简化数据管理操作:
    • 通过用户首选项,开发者可以轻松实现数据的存储、读取和删除操作,提高了开发效率。
  4. 数据安全性:
    • 鸿蒙系统注重安全性,用户首选项作为系统的一部分,同样享有系统的安全保护措施,帮助保护用户数据的安全和隐私。通过用户首选项,开发者可以轻松实现数据的存储、读取和删除操作,提高了开发效率。
  5. 跨平台应用支持:
    • 鸿蒙系统支持跨平台应用的开发和使用,用户首选项作为系统的一部分,也支持跨平台的数据管理,为开发者提供了更大的灵活性。
  6. 统一开发接口和工具:
    • 鸿蒙系统提供了统一的开发接口和工具,如DevEco Studio等,这些工具支持用户首选项的开发和使用,进一步简化了开发过程。

由于项目中很多功能都需要首选项的使用, 所有我对首选项功能进行了封装, 下面是详细封装的代码片段

要引入鸿蒙提供的包

import dataPreferences from '@ohos.data.preferences'

声明生命上下文的变量, 首选项的变量, 临时首选项的变量

let context = getContext(this);
let preference: dataPreferences.Preferences;
let preferenceTemp: dataPreferences.Preferences;

调用getPreferences方法读取指定首选项持久化文件,将数据加载到Preferences实例,用于数据操作

static async deletePreferences(key: string) {
  try {
    await dataPreferences.deletePreferences(context, key);
  } catch(err) {
    Logger.error(TAG, `Failed to delete preferences, Cause: ${err}`);
  };
  preference = preferenceTemp;
}

使用Preferences的get方法读取数据。如果键不存在,则返回默认值。例如获取下面代码中result的值,如果result的键KEY_NAME不存在,则会返回空字符串。通过默认值的设置,来避免程序出现异常

static async getPreference<T>(key: string) {
  let result = '';
  if (!preference) {
    await PreferenceModel.getPreferencesFromStorage<T>(key);
  }
  try {
    result = (await preference.get(key, '')).toString();
  } catch (err) {
    Logger.error(TAG, `Failed to get value, Cause: ${err}`);
  }
  if (result === '') {
    return;
  }
  return result.replace(/""/g, '"')
}

获取Preferences实例后,使用Preferences的put方法,将数据保存到缓存的实例中。再通过Preferences的flush方法将Preferences实例异步存储到首选项持久化文件中

static async putPreference<T>(key: string, value: T) {
  if (!preference) {
    await PreferenceModel.getPreferencesFromStorage<T>(key);
  }
  try {
    await preference.put(key, JSON.stringify(value));
  } catch (err) {
    Logger.error(TAG, `Failed to put value, Cause: ${err}`);
  }
  await preference.flush();
}

处理从数据库获取的数据。

static async getKeyData<T>(key: string) {
  return await PreferenceModel.getPreference<T>(key)
}

判断是否为空

static checkKeyData<T>(value: T) {
  // 字符串类型
  if((typeof value) === 'string' && value === '') {
    return true;
  }
  // 对象类型
  if((typeof value) === 'object' && JSON.parse(JSON.stringify(value))?.id === '') {
    return true;
  }

  return false;
}

写入数据

static writeData<T>(key: string, value: T) {
  let isDataNull = PreferenceModel.checkKeyData<T>(value);
  if (isDataNull) {
    return;
  }
  PreferenceModel.putPreference<T>(key, value);
}

如何使用

  1. 将要存储的数据放入首选项中
PreferenceModel.putPreference<IClockItem>('clockInfo', res.data)
  1. 获取首选项数据
const value = await PreferenceModel.getKeyData<string>('token')