鸿蒙开发之数据持久化存储Preferences
2023-12-20 00:30:51
用户首选项(Preferences)提供的是key-value键值对的方式处理数据。类似于iOS开发中的NSUserDefault,主要针对的是轻量化数据的存储。如:字体大小、用户的信息等。
其中,key为字符串类型,value是string、number、boolean以及其组成的数组类型。
一、过程
如果有安卓或者iOS开发经验,其实使用的步骤是一样的。
对于存储一个数据
- 获取Preferences类的对象
- 利用对象存储当前数据
- 信息同步持久化
对于获取一个数据
- 获取Preferences类的对象
- 利用对象来获取数据
二、实操
存储一个数据
//引入头文件,吐槽一下居然不提示,而且不自动导入。。。。。
import dataPreferences from '@ohos.data.preferences';
//定义key来获取Preferences对象
const PREFERENCE_KEY = 'PREFERENCE_KEY'
//要持久化存储数据的key
const MSG_KEY = 'MSG_KEY'
//定义一个方法来设置key为val的数据
setSomeThing(key: string, val: string){
//回调数据中的preference即为要操作的对象
dataPreferences.getPreferences(getContext(this),PREFERENCE_KEY,(err,preference) =>{
if (err) {
console.log('get preference error' + err)
return
}
//通过put方法,设置val
preference.put(key,val,(err) =>{
if (err) {
console.log('put value error')
return
}
//通过flush进行写入同步
preference.flush((err) => {
if (err) {
console.log('flush value error')
return
}
console.log('flush value success')
})
})
})
}
获取一个key对应的数据
getValueForKey(key: string) {
//获取要操作的Preferences
dataPreferences.getPreferences(getContext(this),PREFERENCE_KEY,(err,preference) => {
if (err) {
console.log('get preference error' + err)
return
}
//获取key对应的值
preference.get(key,'default',(err,val) => {
if (err) {
console.log('get val error' + err)
return
}
//打印对应的值
console.log('val is '+ val)
})
})
}
三、遇到的问题
我在开发过程中,通过key获取到val时,并不是来打印的,二是通过改变项目中的一个@State装饰的变量来驱动UI的改变。但是,我在Text的click中拿不到数据,因为?preference.get方法返回的是异步的promise。想要获取这个数值就需要结合async和await来等待数值返回。
show code
@State message: string = 'Hello World'
build() {
Row() {
Column() {
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
.onClick(() => {
//我想要通过方法拿到string来更新this.message驱动UI更新,但是拿到的都是空
let msg: string = this.getValueForKey(MSG_KEY)
this.message = msg
})
}
.width('100%')
}
.height('100%')
}
现在知道想要的结果了,说一下怎么达到目的
//想改变的数据
@State message: string = 'Hello World'
build() {
Row() {
Column() {
Button('存储')
.onClick(() => {
this.putSomeThing(MSG_KEY,'abc123')
})
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
//将点击事件回调async修饰
.onClick(async () => {
//await等待this.getValueForKey方法返回
let msg: string = await this.getValueForKey(MSG_KEY)
this.message = msg
})
}
.width('100%')
}
.height('100%')
}
//将getValueForKey用async修饰,返回一个Promise对象
async getValueForKey(key: string): Promise<string> {
//通过await同步等待一个preference
let preference = await dataPreferences.getPreferences(getContext(this), PREFERENCE_KEY)
//返回一个Promise,需要转一下类型,否则报错
return preference.get(key,'default Value') as Promise<string>
}
四、全部代码
import dataPreferences from '@ohos.data.preferences';
const PREFERENCE_KEY = 'PREFERENCE_KEY'
const MSG_KEY = 'MSG_KEY'
@Entry
@Component
struct StorePage {
@State message: string = 'Hello World'
build() {
Row() {
Column() {
Button('存储')
.onClick(() => {
this.setSomeThing(MSG_KEY,'abc123')
})
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
.onClick(async () => {
let msg: string = await this.getValueForKey(MSG_KEY)
this.message = msg
})
}
.width('100%')
}
.height('100%')
}
//设置数据
setSomeThing(key: string, val: string){
dataPreferences.getPreferences(getContext(this),PREFERENCE_KEY,(err,preference) =>{
if (err) {
console.log('get preference error' + err)
return
}
preference.put(key,val,(err) =>{
if (err) {
console.log('put value error')
return
}
preference.flush((err) => {
if (err) {
console.log('flush value error')
return
}
console.log('flush value success')
})
})
})
}
//获取数据
async getValueForKey(key: string): Promise<string> {
let preference = await dataPreferences.getPreferences(getContext(this), PREFERENCE_KEY)
return preference.get(key,'default Value') as Promise<string>
}
通过点击按钮保存数据,通过点击Text来获取数据并展示。
? ? ? ? 写在最后,吐槽一下,实际应用中,我们获取到val肯定要同步处理一些UI上的显示或者逻辑,但肯定不是简单的打印。而且,我们会将这个Preferences定义一个工具类,所以一定需要把数据抛出来。但是,官网只是简单的打印,如果经验不足虽然已经拿到数据了但是抛出来还是得废点事~。
文章来源:https://blog.csdn.net/Lu_Ca/article/details/135095266
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!