sendablePreferences.Preferences.putSync存Uint8Array报错 - HarmonyOS 鸿蒙Next

sendablePreferences.Preferences.putSync存Uint8Array报错 - HarmonyOS 鸿蒙Next

public putString(key: string, value: string) { if (ObjectUtils.isStrEmpty(key)) { return; } if (!this.dataPreferences) { return; } let textEncoder = new util.TextEncoder(); let buffer = new ArrayBuffer(4); let uint8 = new Uint8Array(buffer); let uInt8Array = textEncoder.encodeIntoUint8Array(value, uint8); this.dataPreferences.putSync(key, uInt8Array); }

中putSync这个位置报错 但是如果是

let textEncoder = new util.TextEncoder();
let buffer = new ArrayBuffer(4);
let uint8 = new Uint8Array(buffer);
let uInt8Array = textEncoder.encodeInto(value, uint8);
this.dataPreferences.putSync(key, uInt8Array);

就不会有错,可是encodeInto方法编译器标记的是已过时,建议使用encodeIntoUint8Array替代。但是我是用时,编译器在this.dataPreferences.putSync(key, uInt8Array);中的uInt8Array标记为红下划线,提示Structural typing is not supported (arkts-no-structural-typing) 所以我不知道正确的写法应该是是什么。

此外我还有三个疑问

  1. 关于获取存储的数据
public getString(key: string, defaultValue?: string): string {
let value = defaultValue ? defaultValue : '';
if (ObjectUtils.isStrEmpty(key)) {
return value;
}
if (!this.dataPreferences) {
return value
}
let uInt8Array: preferences.ValueType = this.dataPreferences.getSync(key, '');
let textDecoder = util.TextDecoder.create('utf-8');
value = textDecoder.decodeToString(uInt8Array as Uint8Array);
return value;
}

这里这样的写法,可以将存储的值还原回来?

  1. 就是如果现在我想播放音乐,需要只记一个播放信息,可能在播放实例播放时播放进度一直变化的过程中,记录当前播放信息的进度,不知道这个是否合适

  2. Map数据结构是都是不可序列化的


更多关于sendablePreferences.Preferences.putSync存Uint8Array报错 - HarmonyOS 鸿蒙Next的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

你好,问题正在内部处理中,有结果会立马回复的

更多关于sendablePreferences.Preferences.putSync存Uint8Array报错 - HarmonyOS 鸿蒙Next的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,sendablePreferences.Preferences.putSync用于同步存储数据。当尝试存储Uint8Array类型数据时,可能会报错,原因在于Preferences API目前不支持直接存储Uint8Array类型。

Preferences API支持的基本数据类型包括stringnumberbooleanArrayObject。如果需要存储Uint8Array,可以将其转换为支持的格式,例如将Uint8Array转换为Arraystring后再存储。

示例代码:

let uint8Array = new Uint8Array([1, 2, 3]);
let array = Array.from(uint8Array); // 转换为Array
sendablePreferences.Preferences.putSync('key', array); // 存储Array

或者:

let uint8Array = new Uint8Array([1, 2, 3]);
let str = String.fromCharCode.apply(null, uint8Array); // 转换为string
sendablePreferences.Preferences.putSync('key', str); // 存储string

确保在读取时进行相应的转换操作,以恢复原始数据类型。

回到顶部