HarmonyOS 鸿蒙Next 绕懵了 自定义Preference工具类 初始化多次 是否会覆盖上一次

HarmonyOS 鸿蒙Next 绕懵了 自定义Preference工具类 初始化多次 是否会覆盖上一次 下面的代码是我测试的代码,我的测试顺序是:

①点击 初始化a -> 存a -> 取a -> 存b -> 取b
这时preferences命名为a,里面存了两个值,可以查询,没有问题

②点击 初始化b -> 取a -> 取b
这时preferences命名为b,里面取不到值,不显示,没有问题

③点击 存a -> 取a -> 存b -> 取b
这时preferences命名为b,里面存了两个值,可以查询,没有问题

④点击 初始化a -> 取a -> 取b
这时preferences命名为a,依然可以取到两个值,这是怎么回事?

import dataPreferences from '@ohos.data.preferences';
import common from '@ohos.app.ability.common';

let context = getContext(this) as common.UIAbilityContext
let preference: dataPreferences.Preferences;

@Entry
@Component
struct Application_8 {
  // 初始化Preferences
  async getPreferencesFromStorage(db_name: string) {
    try {
      preference = await dataPreferences.getPreferences(context, db_name);
      console.info('tip',`db_name${db_name}`)
    } catch (err) {
    }
  }

  // 存
  async putPreference(data: any, key: string) {
    try {
      if (typeof data === 'object' && data !== null) {
        await preference.put(key, JSON.stringify(data));
      } else {
        await preference.put(key, data);
      }
    } catch (err) {
    }
    await preference.flush();
  }

  // 取
  async getPreference(key: string) {
    let storage;
    try {
      storage = (await preference.get(key, ''));
    } catch (err) {
    }
    if (!storage) {
      return '';
    }
    return storage;
  }

  @State str_a: string = ''
  @State str_b: string = ''

  build() {

    Column({ space: 5 }) {

      Text(this.str_a)
      Text(this.str_b)

      Button('初始化a').width(200).onClick(() => {
        this.getPreferencesFromStorage('a')
      })
      Button('存a').width(200).onClick(() => {
        this.putPreference('存a', 'a')
      })
      Button('取a').width(200).onClick(() => {
        this.getPreference('a').then(data => {
          this.str_a = data
        })
      })

      Button('初始化b').width(200).onClick(() => {
        this.getPreferencesFromStorage('b')
      })
      Button('存b').width(200).onClick(() => {
        this.putPreference('存b', 'b')
      })
      Button('取b').width(200).onClick(() => {
        this.getPreference('b').then(data => {
            this.str_b = data
          })
      })
    }
  }
}

更多关于HarmonyOS 鸿蒙Next 绕懵了 自定义Preference工具类 初始化多次 是否会覆盖上一次的实战教程也可以访问 https://www.itying.com/category-93-b0.html

8 回复

①点击 初始化 preferencesA -> 存a -> 取a -> 存b -> 取b
preferencesA 里面有 内容,a, b

②创建 preferencesB -> 取a -> 取b
preferencesB 里面无 a, 无 b

③创建 preferencesB 存a -> 取a -> 存b -> 取b
之前已经创建过 preferencesB 了,这里创建preferencesB应该会被忽略
preferencesB 里有 a, b

④点击 初始化 preferencesA -> 取a -> 取b
之前已经创建过 preferencesA 了,这里创建preferencesA应该会被忽略
preferencesA 里还是之前的内容 a,b

更多关于HarmonyOS 鸿蒙Next 绕懵了 自定义Preference工具类 初始化多次 是否会覆盖上一次的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


第二步,取a,取b的时候,不应该都取不到吗,创建b的时候,把a取代了,b里应该无值的吧,

创建 preferencesB -> 取a -> 取b

preferencesB 里面无 a, 无 b,

姓名: 张三
职位: 软件工程师
简介: 拥有超过10年的软件开发经验,擅长Java和Python编程。

各位如果有看的话,帮我看看我理解的对不,感谢

①如果初始化的时候,使用一样的初始化方法,穿参为preferences的命名,那么就会覆盖上一次的初始化

②对于上述的步骤四,依然可以查询到值,我的理解是,第二次初始化只是覆盖了第一次初始化,但是并没有删除掉第一次初始化的内容,所以还是可以查到值的

完整代码

```javascript
import dataPreferences from '[@ohos](/user/ohos).data.preferences';
import common from '[@ohos](/user/ohos).app.ability.common';

let context = getContext(this) as common.UIAbilityContext
let prefMap: Map<string, dataPreferences.Preferences> = new Map()


[@Entry](/user/Entry)
[@Component](/user/Component)
struct Application_8 {
  // 初始化Preferences
  async getPreferencesFromStorage(db_name: string) {
    let pref = await dataPreferences.getPreferences(context, db_name);
    prefMap.set(db_name, pref)
  }

  // 存
  async putPreference(name: string, data: any, key: string) {
    let pref = prefMap.get(name)
    await pref.put(key, JSON.stringify(data));
    await pref.flush();
  }

  // 取
  async getPreference(name: string, key: string) {
    let pref = prefMap.get(name)
    let storage = await pref.get(key, '');
    return storage as string;
  }

  [@State](/user/State) str_a: string = ''
  [@State](/user/State) str_b: string = ''

  build() {

    Column({ space: 5 }) {

      Text(this.str_a)
      Text(this.str_b)

      Button('初始化a').width(200).onClick(() => {
        this.getPreferencesFromStorage('a')
      })
      Button('存a').width(200).onClick(() => {
        this.putPreference('a', '存a', 'a')
      })
      Button('取a').width(200).onClick(() => {
        this.getPreference('a', 'a').then(data => {
          this.str_a = data
        })
      })

      Button('初始化b').width(200).onClick(() => {
        this.getPreferencesFromStorage('b')
      })
      Button('存b').width(200).onClick(() => {
        this.putPreference('b', '存b', 'b')
      })
      Button('取b').width(200).onClick(() => {
        this.getPreference('b', 'b').then(data => {
          this.str_b = data
        })
      })
    }
  }
}

在一个工具类中如果想解决会覆盖的问题,可以定义一个Map

// 定义Map
let prefMap: Map<string, dataPreferences.Preferences> = new Map()
// 初始化
async getPreferencesFromStorage(db_name: string) {
  let pref = await dataPreferences.getPreferences(context, db_name);
  prefMap.set(db_name, pref)
}
// 存
async putPreference(name: string, data: any, key: string) {
  let pref = prefMap.get(name)
  await pref.put(key, JSON.stringify(data));
  await pref.flush();
}

// 取
async getPreference(name: string, key: string) {
  let pref = prefMap.get(name)
  let storage = await pref.get(key, '');
  return storage as string;
}

在HarmonyOS(鸿蒙Next)中,自定义Preference工具类的初始化多次是否会覆盖上一次,取决于具体的实现方式。如果每次初始化都会重新创建或重置Preference实例,那么上一次的配置或数据会被覆盖。如果初始化逻辑只是获取已存在的Preference实例,则不会覆盖之前的数据。需要检查工具类的初始化代码逻辑,确保其行为符合预期。

回到顶部