鸿蒙开发之数据持久化存储Preferences

用户首选项(Preferences)提供的是key-value键值对的方式处理数据。类似于iOS开发中的NSUserDefault,主要针对的是轻量化数据的存储。如:字体大小、用户的信息等。

其中,key为字符串类型,value是string、number、boolean以及其组成的数组类型。

官方文档

一、过程

如果有安卓或者iOS开发经验,其实使用的步骤是一样的。

对于存储一个数据

  1. 获取Preferences类的对象
  2. 利用对象存储当前数据
  3. 信息同步持久化

对于获取一个数据

  1. 获取Preferences类的对象
  2. 利用对象来获取数据

二、实操

存储一个数据

//引入头文件,吐槽一下居然不提示,而且不自动导入。。。。。
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定义一个工具类,所以一定需要把数据抛出来。但是,官网只是简单的打印,如果经验不足虽然已经拿到数据了但是抛出来还是得废点事~。

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Shared Preferences进行数据持久化的示例代码: ```dart import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; class ExamplePage extends StatefulWidget { @override _ExamplePageState createState() => _ExamplePageState(); } class _ExamplePageState extends State<ExamplePage> { TextEditingController _controller = TextEditingController(); String _savedText = ''; @override void initState() { super.initState(); _loadSavedText(); } void _loadSavedText() async { SharedPreferences prefs = await SharedPreferences.getInstance(); String savedText = prefs.getString('savedText') ?? ''; setState(() { _savedText = savedText; _controller.text = savedText; }); } void _saveText(String text) async { SharedPreferences prefs = await SharedPreferences.getInstance(); await prefs.setString('savedText', text); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Example Page'), ), body: Padding( padding: EdgeInsets.all(16.0), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: <Widget>[ TextField( controller: _controller, decoration: InputDecoration( labelText: 'Enter some text', ), onChanged: (text) { _saveText(text); }, ), SizedBox(height: 16.0), Text( 'Saved text: $_savedText', style: TextStyle(fontSize: 18.0), ), ], ), ), ); } } ``` 在上述代码,我们首先在initState()方法加载之前保存的文本,并将其设置为文本框的默认值。然后,我们在文本框输入文本时使用SharedPreferences实例保存文本。最后,我们将保存的文本显示在屏幕上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值