HarmonyOS 数据持久化 Preferences 如何在页面中对数据进行读写

news/2024/7/21 11:25:01 标签: 华为, harmonyos, 华为云, 华为od

背景介绍

最近在了解并跟着官方文档尝试做一个鸿蒙app 小demo的过程中对在app中保存数据遇到些问题 特此记录下来
这里的数据持久化以 Preferences为例子展开

废话不多说 这里直接上节目(官方提供的文档示例:) 以Stage模型为例

1.明确preferences的类型

import data_preferences from '@ohos.data.preferences';

let preferences = null;

class EntryAbility extends UIAbility {
    onWindowStageCreate(windowStage) {
        try {
            data_preferences.getPreferences(this.context, 'mystore', function (err, val) {
                if (err) {
                    console.error("Failed to get preferences. code =" + err.code + ", message =" + err.message);
                    return;
                }
                //将val的值赋值给preferences 
                preferences = val;
                console.info("Succeeded in getting preferences.");
            })
        } catch (err) {
            console.error("Failed to get preferences. code =" + err.code + ", message =" + err.message);
        }
    }
}

到这里 但是当我们使用preferences来调用 val->Preferences的数据进行 get/put操作时 会发现根本没有提示 并且preferences的类型显示的是any类型 不是val所对应的类型

所以这里我们就要在初始化的时候明确的指明preferences的具体类型 鼠标放在val的变量上 按住ctrl 就会发现 (parameter) val: data_preferences.Preferences 这一行 明确指出了val的具体类型
依葫芦画瓢
所以 我们的preferces变量的声明就可以写为:

export var preferences:data_preferences.Preferences = null;

这样我们就可以在当前类中进行随意的操作啦
当然这只是第一步 当我们进行sp操作的时候 往往都是在具体的页面中进行CRUD的 那如何在具体的页面中持有Sp呢?

2.在具体的页面中持有Preferences引用

首先第一步尝试在页面中引入EntryAbility中我们声明的变量
坑点:EntryAbility中的preferences一定要加 export不然外部引用不到

import {preferences} from '../entryability/EntryAbility'

TabContent() {
        Stack() {
          Image($r('app.media.guide_page_four_bg')).objectFit(ImageFit.Auto)
          RelativeContainer() {
            Column() {
              Image($r('app.media.guide_page_four_text')).objectFit(ImageFit.Contain).width('80%')
              Image($r('app.media.guide_page_four')).objectFit(ImageFit.Auto).width('100%').margin({ top: 10 })
              Image($r('app.media.guide_page_four_start'))
                .objectFit(ImageFit.Auto)
                .width(100)
                .height(45)
                .margin({ top: 10 })
                .onClick(()=>{
                  try {
                    preferences.put('first_splash', 'yes', (err) => {
                      if (err) {
                        console.error(`Failed to put first_splash data. Code:${err.code}, message:${err.message}`);
                        return;
                      }
                      console.info('Succeeded in putting first_splash data.');
                    })
                  } catch (err) {
                    console.error(`Failed to put data. first_splash Code: ${err.code},message:${err.message}`);
                  }

                  try {
                    preferences.flush((err) => {
                      if (err) {
                        console.error(`Failed to flush first_splash. Code:${err.code}, message:${err.message}`);
                        return;
                      }
                      console.info('Succeeded in flushing. first_splash');
                    })
                  } catch (err) {
                    console.error(`Failed to flush first_splash. Code:${err.code}, message:${err.message}`);
                  }

                  try {
                    preferences.get('first_splash', 'default', (err, val) => {
                      if (err) {
                        console.error(`Failed to get value of 'startup'. Code:${err.code}, message:${err.message}`);
                        return;
                      }
                      console.info(`Succeeded in getting value of 'startup'. val: ${val}.`);
                    })
                  } catch (err) {
                    console.error(`Failed to get value of 'startup'. Code:${err.code}, message:${err.message}`);
                  }

                })
            }
            .width('60%')
            .height('80%')
            .margin({ top: '20%' })
            .justifyContent(FlexAlign.SpaceBetween)
            .alignRules({
              top: { anchor: '__container__', align: VerticalAlign.Top },
              middle: { anchor: '__container__', align: HorizontalAlign.Center },
            })
            .id("centerCoverFour")

            Text("跳过").id("skipFour")
              .alignRules({
                left: { anchor: 'centerCoverFour', align: HorizontalAlign.End },
                bottom: { anchor: 'centerCoverFour', align: VerticalAlign.Bottom }
              }).fontSize(16)
              .fontColor(Color.White)

          }.width('100%')
          .height('100%')
        }
      }

sp的具体主要逻辑都在onClick中了
具体的操作Log如下:
在这里插入图片描述
ok 到这里就成功啦

3.应用重新启动后持久化数据丢失

场景:在第一次启动后将数据保存完毕之后 清除后台任务重新进入 读取数据正常 deveco中点击重新运行 内存中保存的相应文件被删除

原因:DevEco每次重新启动应用时都是卸载了之前的应用后重新部署,因此相关信息会被清除。
解决方案:
Build->Edit Configurations->勾选 keep application data
在这里插入图片描述


http://www.niftyadmin.cn/n/5220932.html

相关文章

盛元广通实验室安全培训考试系统

盛元广通实验室安全培训考试系统是一种基于互联网和人工智能技术的在线考试平台,旨在旨在提供实验室安全教育和考核的全面解决方案。该系统可以帮助实现实验室安全培训考试的在线化、智能化和规范化,提高实验室安全意识和能力,保障实验室安全…

nodejs+vue+mysql皮具行李箱包包网上商城购物网站

本系统可分为两个大的模块,即前台用户模块和后台管理员模块,前台用户模块用户可以进行浏览查询皮具的各种信息,添加购物车,下订单等各种操作。后台管理员模块管理员可以进行皮具的处理,还有处理订单,皮具分…

PyRFC 服务器端编程要点

PyRFC 支持服务器端编程。什么是服务器端编程?有哪些技术要求?可以参考我的另外一篇博客:SAP接口编程 之JCo3.0系列(06) 。本篇主要介绍 PyRFC 的技术实现。 要点 服务器端编程的主要作用是实现 ABAP 主动调用服务器端编程需要首先在 ABAP…

java数据转换为stream的方法

要将数据转换为Java中的Stream&#xff0c;有几种常见的方法&#xff0c;具体取决于数据类型和数据来源。 集合&#xff08;Collection&#xff09;&#xff1a;集合对象&#xff0c;比如List、Set或者数组&#xff0c;可以使用stream()方法将其转换为Stream。 List<Strin…

探秘网络通信:UDP与TCP/IP的奥秘

**> &#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 探秘网络通信&#xff1a;UDP与TCP/IP的奥秘 前言第一&#xff1a;UDP基础概念UDP的基础概念&#xff1a;UDP的特点和优势UDP与TCP/IP的关系 工作原理1. 无连接性和面…

MySOL常见四种连接查询

1、内联接 &#xff08;典型的联接运算&#xff0c;使用像 或 <> 之类的比较运算符&#xff09;。包括相等联接和自然联接。 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如&#xff0c;检索 students和courses表中学生标识号相同的所有行。 2、…

QTextEdit 是 Qt 框架中的一个类,用于显示和编辑多行文本内容的可编辑部件

QTextEdit 是 Qt 框架中的一个类&#xff0c;用于显示和编辑多行文本内容的可编辑部件。 QTextEdit 提供了一个用于显示和编辑富文本&#xff08;包括格式化文本、图像和链接等&#xff09;和纯文本的文本编辑器。它支持基本的文本操作&#xff08;如复制、粘贴、撤销、重做等…

自动驾驶HWP功能规范

HWP功能规范 Highway Pilot Functional Specification 文件状态&#xff1a; 【√】草稿 【】正式发布 【】正在修改 文件起草分工 撰写&#xff1a; 审核&#xff1a; 编制&#xff1a; 签名&#xff1a; 日期&#xff1a; 审核&#xff1a; 签名&#xff1a; 日期&am…