HarmonyOS 鸿蒙Next中自用的 preferences 范型工具类

HarmonyOS 鸿蒙Next中自用的 preferences 范型工具类

import preferences from '@ohos.data.preferences';
import common from '@ohos.app.ability.common';
import { Log } from '../utils';

const log = Log.scope("PreferencesUtil :")

class PreferencesUtil<PreferencesNameSpace, NameSpace = keyof PreferencesNameSpace, Value = PreferencesNameSpace[keyof PreferencesNameSpace]> {
  preMap: Map<NameSpace, preferences.Preferences> = new Map()

  async createPreferences(context: common.BaseContext, namespace: NameSpace & string) {
    const preference = this.preMap.has(namespace)
    if (!preference) {
      this.loadPreferences(context, namespace)
    }
  }

  private async loadPreferences(context: common.BaseContext, namespace: NameSpace & string) {
    try {
      const preference = await preferences.getPreferences(context, namespace)
      this.preMap.set(namespace, preference)
      log.info("【loadPreferences】 ok", namespace)
      return preference
    } catch (err) {
      log.error("【loadPreferences】 fail", namespace, err)
    }
  }

  async putV(namespace: NameSpace, key: keyof Value & string, value: preferences.ValueType) {
    try {
      const preference = this.preMap.get(namespace)
      if (!preference) {
        return
      }
      await preference.put(key, value)
      log.info("【putV】 ok", namespace)
      await preference.flush()
      return true
    } catch (err) {
      log.error("【putV】 fail", namespace, err)
    }
    return false
  }

  async getV(namespace: NameSpace, key: keyof Value & string, defValue: preferences.ValueType) {
    try {
      const preference = this.preMap.get(namespace)
      if (!preference) {
        return
      }
      const value = await preference.get(key, defValue)
      log.info("【getV】 ok", namespace)
      return value
    } catch (err) {
      log.info("【getV】 fail", namespace,)
    }
  }

  async deleteV(namespace: NameSpace, key: keyof Value & string) {
    try {
      const preference = this.preMap.get(namespace)
      if (!preference) {
        return
      }
      await preference.delete(key)
      await preference.flush()
      log.info("【deleteV】 ok", namespace)
    } catch (err) {
      log.info("【deleteV】 fail", namespace,)
    }
  }

  async clear(namespace: NameSpace) {
    try {
      const preference = this.preMap.get(namespace)
      if (!preference) {
        return
      }
      await preference.clear()
      await preference.flush()
      log.info("【clear】 ok", namespace)
    } catch (err) {
      log.info("【clear】 fail", namespace,)
    }
  }
}

// 系统本地存储
export type NameSpaceStruct = {
  //如果 |string 又没提示了
  "sys": Record<"af" | "b", preferences.ValueType>,
  "page1": Record<string, preferences.ValueType>
}

export default new PreferencesUtil<NameSpaceStruct>()

更多关于HarmonyOS 鸿蒙Next中自用的 preferences 范型工具类的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS 鸿蒙Next中自用的 preferences 范型工具类的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS的鸿蒙Next中,preferences 是一种轻量级的数据存储方式,用于存储用户的偏好设置或简单的键值对数据。为了增强类型安全性和代码复用性,可以使用范型工具类来封装 preferences 的操作。以下是一个简单的范型工具类示例:

import ohos.data.preferences.Preferences;

public class PreferencesHelper<T> {
    private final Preferences preferences;

    public PreferencesHelper(Preferences preferences) {
        this.preferences = preferences;
    }

    public void put(String key, T value) {
        if (value instanceof String) {
            preferences.putString(key, (String) value);
        } else if (value instanceof Integer) {
            preferences.putInt(key, (Integer) value);
        } else if (value instanceof Boolean) {
            preferences.putBoolean(key, (Boolean) value);
        } else if (value instanceof Long) {
            preferences.putLong(key, (Long) value);
        } else if (value instanceof Float) {
            preferences.putFloat(key, (Float) value);
        }
        preferences.flush();
    }

    public T get(String key, T defaultValue) {
        if (defaultValue instanceof String) {
            return (T) preferences.getString(key, (String) defaultValue);
        } else if (defaultValue instanceof Integer) {
            return (T) (Integer) preferences.getInt(key, (Integer) defaultValue);
        } else if (defaultValue instanceof Boolean) {
            return (T) (Boolean) preferences.getBoolean(key, (Boolean) defaultValue);
        } else if (defaultValue instanceof Long) {
            return (T) (Long) preferences.getLong(key, (Long) defaultValue);
        } else if (defaultValue instanceof Float) {
            return (T) (Float) preferences.getFloat(key, (Float) defaultValue);
        }
        return defaultValue;
    }
}

这个工具类通过范型支持多种数据类型,简化了 preferences 的使用,并提高了代码的可读性和安全性。

回到顶部