Harmonyos next:持久化数据之preference(用户首选项)

484 阅读2分钟

应用数据持久化,是指应用将内存中的数据通过文件或数据库的形式保存到设备上。内存中的数据形态通常是任意的数据结构或数据对象,存储介质上的数据形态可能是文本、数据库、二进制文件等。

1.使用场景

简单点说,关闭app后重新打开app需要保持的数据可以称为需要持久化的数据。如记录喝水量的应用,重新打开app后要读取持久化数据,恢复上一次的喝水量。

2.鸿蒙上持久化数据类型

持久化数据类型分为三种:用户首选项、键值对数据库以及关系型数据库

3.用户首选项(Preferences)

官方介绍:用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。当用户希望有一个全局唯一存储的地方,可以采用用户首选项来进行存储。Preferences会将该数据缓存在内存中,当用户读取的时候,能够快速从内存中获取数据,当需要持久化时可以使用flush接口将内存中的数据写入持久化文件中。Preferences会随着存放的数据量越多而导致应用占用的内存越大,因此,Preferences不适合存放过多的数据,也不支持通过配置加密,适用的场景一般为应用保存用户的个性化设置(字体大小,是否开启夜间模式)等。

通俗点说是一个键值对形式的文件。由于文件是持久化的,不会因为进程被杀掉后被清除,所以轻量级的键值对数据可以存储在Preferences里面。

preferences使用时一般要封装一个工具类,对外提供init、set、get、delete接口

3.1 init接口 主要是传入文件的名字和context

  async initPreference(storeName: string, context?: Context): Promise<void> {
    return preferences.getPreferences(context, storeName)
      .then((preferences: preferences.Preferences) => {
        this.preferences = preferences;
      });
  }

3.2 set接口 存值

  async setValue<T>(key: string, value: T): Promise<void> {
    if (this.preferences) {
      this.preferences.put(key, JSON.stringify(value)).then(() => {
        this.saveUserData();
      })
    } else {
      this.initPreference(PREFERENCES_NAME, this.mContext!!).then(() => {
        this.setValue<T>(key, value);
      });
    }
  }

3.3 get接口 取值

  async getValue<T>(key: string): Promise<T | null> {
    if (this.preferences) {
      return this.preferences.get(key, '').then((res: preferences.ValueType) => {
        let value: T | null = null;
        if (res) {
          value = JSON.parse(res as string) as T;
        }
        return value;
      });
    } else {
      return this.initPreference(PREFERENCES_NAME, this.mContext!!).then(() => {
        return this.getValue<T>(key);
      });
    }
  }

3.4 delete接口 删除值

  async deleteValue(key: string): Promise<void> {
    if (this.preferences) {
      this.preferences.delete(key).then(() => {
        this.saveUserData();
      });
    } else {
      this.initPreference(PREFERENCES_NAME, this.mContext!!).then(() => {
        this.deleteValue(key);
      });
    }
  }

3.5 preference文件存储位置

其中要特别注意的是init接口参数的context,这个对应preference文件的存放位置。

如果是application的context,那么文件是存放在包的根目录下,如图

企业微信截图_1734421440834.png

如果是ability的context,对应的位置就是在对应hap下,如图

企业微信截图_17344218255182.png

3.6 preference文件格式

打开对应的preference文件,可以看到是xml格式的键值对数据

<?xml version="1.0" encoding="UTF-8"?>
<preferences version="1.0">
  <string key="key_curDrink">400</string>
  <string key="key_drinkImage">""</string>
  <string key="key_drinkName">"水"</string>
  <string key="key_drinkOnce">100</string>
  <string key="key_totalDrink">10000</string>
</preferences>