用户首选项(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方法,设置valpreference.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) {//获取要操作的PreferencesdataPreferences.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同步等待一个preferencelet 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定义一个工具类,所以一定需要把数据抛出来。但是,官网只是简单的打印,如果经验不足虽然已经拿到数据了但是抛出来还是得废点事~。