HarmonyOS鸿蒙Next中如何解决Preferences存储时报错的问题
HarmonyOS鸿蒙Next中如何解决Preferences存储时报错的问题
【问题现象】
Preferences存储json格式字符串时报错:Parameter error. The type of ‘value’ must be ValueType。
【背景知识】
Preferences的运行机制如下图所示,用户程序通过ArkTS接口调用用户首选项读写对应的数据文件。开发者可以将用户首选项持久化文件的内容加载到Preferences实例,每个文件唯一对应到一个Preferences实例,系统会通过静态容器将该实例存储在内存中,直到主动从内存中移除该实例或者删除该文件。
应用首选项的持久化文件保存在应用沙箱内部,可以通过context获取其路径。具体可见获取应用文件路径。
Preferences在使用过程中会存在以下约束限制:
- 首选项无法保证进程并发安全,会有文件损坏和数据丢失的风险,不支持在多进程场景下使用。
- Key键为string类型,要求非空且长度不超过1024个字节。
- 如果Value值为string类型,请使用UTF-8编码格式,可以为空,不为空时长度不超过16 * 1024 * 1024个字节。
- 内存会随着存储数据量的增大而增大,所以存储的数据量应该是轻量级的,建议存储的数据不超过一万条,否则会在内存方面产生较大的开销。
【定位思路】
@Entry
@Component
struct AAPage {
dataPreferences: preferences.Preferences | null = null;
aboutToAppear(): void {
let options: preferences.Options = { name: 'myStore' };
this.dataPreferences = preferences.getPreferencesSync(getContext(this), options);
}
build() {
Column() {
Button('新增首选项-少')
.onClick(() => {
try {
// 当字符串有特殊字符时,需要将字符串转为Uint8Array类型再存储
let uInt8Array1 = new util.TextEncoder().encodeInto("~!@# ¥%……&*()——+?");
this.dataPreferences?.putSync('small', uInt8Array1);
console.log('新增small成功')
} catch (e) {
console.log('新增small异常', JSON.stringify(e))
}
this.dataPreferences?.flush((err: BusinessError) => {
if (err) {
console.error(`刷入失败. Code:${err.code}, message:${err.message}`);
return;
}
console.info('刷入成功');
})
})
Button('新增首选项-多')
.onClick(() => {
try {
let key = '一段超长文本(自行添加)'
this.dataPreferences?.putSync(key, 'value');
console.log('新增big成功')
} catch (e) {
console.log('新增big异常', JSON.stringify(e))
}
this.dataPreferences?.flush((err: BusinessError) => {
if (err) {
console.error(`刷入失败. Code:${err.code}, message:${err.message}`);
return;
}
console.info('刷入成功');
})
}
)
}
}
}
点击“新增首选项-少”按钮可以正常添加,点击“新增首选项-多”会出现错误,根据错误提示来定位问题。
根据官网文档提示,表明传入的参数错误。可能的原因:
- 强制参数未指定;
- 参数类型不正确;
- 参数校验失败。
通过对传入的参数进行校验,发现传入的Key超过了最大上限。
【解决方案】
- Preferences的Key键为string类型,要求非空且长度不超过1024个字节。
- 如果Preferences的Value值为string类型,请使用UTF-8编码格式,可以为空,不为空时长度不超过16 * 1024 * 1024个字节。
根据上述限制,修改保存进Preferences的key名称,防止超过最大长度。比如采用小驼峰式简洁的命名方式:let key = ‘myKey’。
更多关于HarmonyOS鸿蒙Next中如何解决Preferences存储时报错的问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于HarmonyOS鸿蒙Next中如何解决Preferences存储时报错的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,使用Preferences存储数据时,可能会遇到报错问题
以下是一些常见原因及解决方法:
-
权限问题:确保应用已获取必要的存储权限。在
config.json
文件中添加ohos.permission.WRITE_USER_STORAGE
和ohos.permission.READ_USER_STORAGE
权限。 -
键值对格式错误:Preferences存储的键值对必须符合规范。键应为字符串,值可以是字符串、数字、布尔值等基本类型。确保键值对的格式正确。
-
存储路径问题:Preferences存储路径应正确设置。使用
getPreferences
方法时,确保路径参数正确无误。 -
数据大小限制:Preferences存储有数据大小限制,单个键值对的大小不能超过一定范围。如果数据过大,考虑使用其他存储方式。
-
并发访问问题:在多线程环境下,确保对Preferences的访问是线程安全的。可以使用
Preferences
的put
和get
方法时加锁,避免并发访问导致的数据不一致。 -
存储空间不足:检查设备存储空间是否充足。如果存储空间不足,可能导致Preferences存储失败。
-
版本兼容性:确保使用的HarmonyOS SDK版本与设备系统版本兼容。不同版本可能存在API差异,导致存储报错。
-
异常处理:在代码中添加异常处理机制,捕获并处理可能出现的异常,如
PreferencesFileReadException
和PreferencesFileWriteException
。
通过以上方法,可以有效解决HarmonyOS鸿蒙Next中Preferences存储时报错的问题。