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
①点击 初始化 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,
各位如果有看的话,帮我看看我理解的对不,感谢
①如果初始化的时候,使用一样的初始化方法,穿参为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实例,则不会覆盖之前的数据。需要检查工具类的初始化代码逻辑,确保其行为符合预期。