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

news2024/9/30 11:37:06

背景介绍

最近在了解并跟着官方文档尝试做一个鸿蒙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.coloradmin.cn/o/1261674.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

类 —— 友元、常/静态成员函数

类 类的大小 和结构体大小求法一致。但需注意,普通空类也会占用 1 字节大小,因为普通空类可以实例化对象。 而 抽象空类占 4 字节(32 位机中),因为抽象空类中含有虚指针(含有虚函数的非抽象空类同理&am…

云原生实战课大纲<2>

我们pod的数据挂载文件可以使用 pv-pvc的方式 1. 创建pv池 2. 在pv池中创建pv,并且设置pv的模式 3. 编写pod 写对应的pvc 申请书 就可以了这就是我们k8s中的pv和pvc 基于pv池创建pv的时候会有容量限制呢么关于配置呢,我们以前会有这种场景 比如说在dock…

试题与研究编辑部试题与研究杂志社试题与研究杂志2023年第36期目录

试题与研究编辑部试题与研究杂志社试题与研究杂志2023年第36期目录 教海纵横 高中生物教学中启发式教学方法的应用 买玲; 1-3 初中文言文教学传承传统文化精神的策略探索 张志静; 4-6《试题与研究》投稿:cn7kantougao163.com 信息化背景下初中地理高效…

Unity中Shader的BRDF解析(一)

文章目录 前言现在我们主要来看Standard的 漫反射 和 镜面反射一、PBS的核心计算BRDF二、Standard的镜面高光颜色三、具体的BRDF计算对于BRDF的具体计算,在下篇文章中,继续解析 四、最终代码.cginc文件Shader文件 前言 在上篇文章中,我们解析…

OpenGL之Mesa3D编译for Ubuntu20.04(三十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

入金牌投资平台,学先进炒股技术,掌未来宝贵财富

钱是个好东西,它能让人享受到世间的甜,它能让人感受到万众瞩目的荣耀,它能让人得到一切该有的尊敬。可以这么说,没有人不爱钱。可是,君子爱财取之有道。对于正常的人而言,都只希望通过正规的渠道赚到尽可能…

SSL证书是选免费的还是付费的好?

在当今的数字化时代,网络安全已经成为了每个网站和应用程序的重要组成部分。为了保护用户的数据安全,许多网站和应用程序都选择了使用SSL证书。然而,面对市场上的各种SSL证书,用户往往会面临一个问题:SSL证书是选免费的…

抽象类-Java

抽象类 一、父类方法的不确定性二、抽象类介绍三、抽象类细节四、练习题 一、父类方法的不确定性 引入:对于一个动物,不知道它吃什么,比如猫吃鱼,兔子吃萝卜。动物类中的 eat 方法往往由它的子类去具体实现。 class Animal {pub…

前端开发学习 (三) 列表功能

一、列表功能 1、列表功能 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compa…

Buzz库python代码示例

Buzz库来编写一个下载器程序。 php <?php require_once vendor/autoload.php; // 引入Buzz库 use Buzz\Browser; use Buzz\Message\Response; $browser new Browser(); // 设置 $browser->setHttpClient(new HttpClientProxy([ host > , port > , ])…

c++容器详解Vector、deque、list、set、multiset、map、multimap、queue、stcak、Array

容器 数据结构描述实现头文件向量(vector)连续存储的元素<vector>列表(list)由节点组成的双向链表,每个结点包含着一个元素<list>双向队列(deque)连续存储的指向不同元素的指针所组成的数组<deque>集合(set)由节点组成的红黑树,每个节点都包含着一个元素,…

chatglm3 vllm部署推理;api访问使用

用fastchat部署暂时有各种问题,参考:https://github.com/lm-sys/FastChat/pull/2622 本篇用vllm运行测试可以使用 1、vllm运行 python -m vllm.entrypoints.api_server --model /***/chatglm/chatglm3-6b/

景联文科技加入中国人工智能产业联盟(AIIA)数据委员会

近日&#xff0c;景联文科技加入中国人工智能产业联盟&#xff08;AIIA&#xff09;数据委员会&#xff0c;成为委员会成员单位。 中国人工智能产业发展联盟&#xff08;简称AIIA&#xff09;是在国家发改委、科技部、工信部、网信办指导下&#xff0c;由中国信息通信研究院等单…

colab notebook导出为PDF

目录 方法一&#xff1a;使用浏览器打印功能 方法二&#xff1a;使用nbconvert转换 方法三&#xff1a;在线转换 方法一&#xff1a;使用浏览器打印功能 一般快捷键是CTRLP 然后改变目标打印机为另存为PDF 这样就可以将notebook保存为PDF了 方法二&#xff1a;使用nbconver…

【labelimg使用小技巧】

小技巧 打开labelimg后&#xff0c;在上方的视图中&#xff0c;勾选自动保存&#xff0c;即可每次操作后自行保存&#xff0c;无需确认保存所在文件位置 上述勾选完成后&#xff0c;W为新建标注框&#xff0c;进行命名后&#xff0c;S即为切换下一张图像 如何放大图片呢 &am…

linux查看emmc分区信息(10种方法 )

目录 ## 1 emmc ## 2 uboot查看 ## 3 kernel查看 方法1 方法2 方法3 方法4 方法5 方法6 方法7 方法8 方法9 方法10 ## 1 emmc 我们要说的是&#xff0c;User Data Partition中的再分区 可简化为 ## 2 uboot查看 u-boot> mmc partPartition Map for MMC device…

界面控件DevExpress WPF流程图组件,完美复制Visio UI!(二)

DevExpress WPF Diagram&#xff08;流程图&#xff09;控件帮助用户完美复制Microsoft Visio UI&#xff0c;并将信息丰富且组织良好的图表、流程图和组织图轻松合并到您的下一个WPF项目中。 在上文中&#xff08;点击这里回顾>>&#xff09;&#xff0c;我们为大家介绍…

【unity实战】基于权重的随机事件(附项目源码)

文章目录 前言开始一、简单的使用二、完善各种事件1. 完善生成金币事件2. 完善生成敌人事件敌人3. 完善生成药水事件 最终效果参考源码完结 前言 随机功能和UnityEvent前面其实我们都已经做过了&#xff0c;但是随机UnityEvent事件要怎么使用呢&#xff1f;这里就来举一个例子…

技术人如何实现颠覆式成长

前言 颠覆式成长要求个人不断创新、承担风险&#xff0c;并抓住机遇。通过创新的方法&#xff0c;充分发挥个人的优势&#xff0c;并在个人成长中突破传统、发挥独特的方式和思考&#xff0c;从而实现个人创造力和效能的突破。 颠覆式成长需要不断学习和个人发展&#xff0c;…