HarmonyOS5关于preference用户首选项进行持久化数据
这种持久化是数据的持化,因为这种储存的复用性极高,故我这边选择封装为一个工具类来进行复用。
·
1.preference:用户首选项
这种持久化是轻量级数据的持化,采用键值的方式进行存储
因为这种储存的复用性极高,故我这边选择封装为一个工具类来进行复用
1.2首先创建实例,用来接收后面初始化传入的实例对象

1.3初始化获取应用上下文信息以及传入设定的表名

初始化后我们就得到了一个实例对象,后面的一些添加删除等方法均在该实例上
1.4 flush写入硬盘进行持久化
这时候直接调用添加的数据也有,但是还没有写入硬盘,这时候需要通过flush方法刷新到硬盘中
因同样也需重复调用,故也可以封装为方法

1.5 封装查询数据的方法
使用getSync来查询,如果查询不到值则会把第二个值作为默认值赋予

1.6 修改数据方法封装
同样也是调用getPreferencesSync来进行数据的添加
这个方法是有值则覆盖,没值就是新增

1.7 删除同样也可以封装为一个方法
调用实例里的delete方法接收删除的元素标识,然后给予一些适当的提示

以上是一些常用的用户首选项的方法,通过这些方法能把数据持续化保存
具体其他方法可看官网
// 持久化数据
export class PreferencesUtil {
// 获取Preferences实例 储存初始化得到的用户首选项的实例
private dataPreferences: preferences.Preferences | null = null;
/**
* 初始化preferences对象
* @param context
*/
init(context: Context, storeName: string) {
// Preferences实例的名称 你要实例那个首选项 类型是preferences.Options
let options: preferences.Options = { name: storeName };
// 获取实例存储对象
this.dataPreferences = preferences.getPreferencesSync(context, options);
// 首次进入时,恭喜初始化成功
loggerUtils.info('初始持久化工具成功')
// 当Key值变化时,触发回调,重新刷新数据到硬盘
// 监听不到 这个on确定能放工具类里面吗
// on的监听貌似得先flush保存其内之后才能监听
this.dataPreferences.on('change', (key: string) => {
loggerUtils.info(`The key ${key} changed`);
})
}
flushData() {
(this.dataPreferences as preferences.Preferences).flush((error: BusinessError) => {
if (error) {
loggerUtils.error(`Failed to flush. Code: ${error.code},message: ${error.message}`)
return
}
loggerUtils.info(`Succeeded in flushing`)
})
}
// 添加数据
insert(key: string, value: string) {
if (this.dataPreferences) {
// 检查缓存的Preferences实例中是否包含指定Key的存储键值对,此为同步接口
if (this.dataPreferences.hasSync(key)) {
loggerUtils.info(`已经存在key:${key}`)
promptAction.showToast({
message: '已存在同名key',
duration: 5000
})
} else {
this.dataPreferences.putSync(key, value)
promptAction.showToast({
message: '添加成功',
duration: 5000
})
preferencesUtil.flushData()
}
}
// preferencesUtil.flushData()
// this.dataPreferences?.flush().then(() => {
// console.info("Succeeded in flushing.");
// }).catch((err: BusinessError) => {
// console.error("Failed to flush. code =" + err.code + ", message =" + err.message);
// })
}
// 查询数据 不一定能取到值
readData(key: string, value?: string) {
// 外层的都是if判断都是防止数据为空 不判断也可用断言as的方式来防止为空
try {
// getSync从缓存的Preferences实例中获取键对应的值,如果值为null或者非默认值类型,返回默认数据defValue
// 有值获取值 没有值获取默认疏浚
let info = this.dataPreferences?.getSync(key, value ? value : "default")
loggerUtils.info(`已查到数据,The '${key}' value is + '${info}'`)
promptAction.showToast({
message: '已查询到持久化数据',
duration: 5000
})
return info
} catch (err) {
return '查询错误'
}
}
// 查询全部数据
readAllData() {
return new Promise((resolve: (value: string | number | boolean | Uint8Array) => void,
reject: (value?: string) => void) => {
this.dataPreferences?.getAll((err: BusinessError, value: Object) => {
// 错误一般为具体的错误对象 err为undefined时,程序正确执行没有错误
if (err) {
// 失败把具体错误对象数字名打印出来
loggerUtils.error("Failed to get all key-values. code = " + err.code, "message = " + err.message)
reject('查询所有数据失败')
return
}
let allKeys = Object.keys(value)
loggerUtils.info("getAll keys = ", JSON.stringify(allKeys))
// 不能返回对象回去,通过拼接返回string类型,通过split分割拿到新的数组
resolve(allKeys.join('-'))
})
})
}
// 修改数据
update(key: string, value: string) {
if (this.dataPreferences?.hasSync(key)) {
loggerUtils.info('已查询到该键,正在为您修改')
preferencesUtil.insert(key, value)
preferencesUtil.flushData()
// preferencesUtil.flushData()
} else {
loggerUtils.info('未查询到该键,无法修改')
}
}
delete(key: string) {
if (this.dataPreferences) {
this.dataPreferences.delete(key, (err: BusinessError, data) => {
if (err) {
console.error("Failed to delete the key 'startup'. code =" + err.code + ", message =" + err.message);
return;
}
console.info("Succeeded in deleting the key 'startup'.");
promptAction.showToast({
message: '已删除',
duration: 5000
})
preferencesUtil.flushData()
})
}
}
clearAllData() {
}
}
export let preferencesUtil = new PreferencesUtil()
更多推荐



所有评论(0)