HarmonyOS 数据持久化之首选项 preferences

接下来 我们来说说数据持久化的问题

我们平时处理的数据都是在内存中处理的
我们应用一点重启 所有数据都消失了 肯恩是不符合一些场景的

harmonyos中 提供了比较多的解决方案
最多的两种是
用户首选项
关系型数据库

本文的话 我们就来看看 用户首选项

首先,什么是用户首选项?
全称 Preference 它为应用提供了 key-value 键值对形式的数据处理,支持应用轻量级的持久化数据

轻量级 就是指 比如 name 啊 age呀 这种 一个字符串 一个数字 或者 布尔 这种 占内存非常小的数据类型
首选项 就能为它们提供持久化处理

这里 有几个注意事项
key 必须是字符串类型 且长度不能超过 88 个字符
value 类型可以是 string number boolean 或者这些类型的数组,数据总大小不能超过 8192 字节
数据量 建议不超过一万条

毕竟说是轻量级

那么 话不多说 我们直接来看用法
首先 建议不要直接写在代码中 我们将首选项的代码逻辑 抽离出来 看着会更规范 也更好解决一点
我们在对应模块 下的 ets目录下 创建一个包 我这里叫 utils
在这里插入图片描述
下面创建一个 TS文件
在这里插入图片描述
我这里 先叫 PreferencesUtil
编写代码如下

//导入 preferences 首选项操作对象 这个包是harmonyos自带的 无需安装
import preferences from '@ohos.data.preferences';

//创建类对象 名称叫 PreferencesUtil
class PreferencesUtil{

  //定义一个map 存储所有进入 首选项的键值
  prefMap: Map<string,preferences.Preferences> = new Map()

  //加载实例
  async getPreferences(context,name:string){
    try {
      /*
        * preferences.getPreferences用于获取首选项实例方法 读取指定文件
        * 参数context  是UIAbility的 上下文 UIAbilityContext
        * name 字符串 首选项名称 用于区分 不能重名
      */
      let pref = await preferences.getPreferences(context, name);
      //将当前初始化的实力的  name 和实例对象 存入 prefMap 集合对象
      this.prefMap.set(name, pref);
      //在控制台 输出成功结果
      console.log('testTag',`加载Preferences[${name}]成功`)
    }catch(e) {
      //在控制台 输出失败结果  将失败信息对象 转成 字符串类型stringify
       console.log('testTag',`加载Preferences[${name}]失败`,JSON.stringify(e))
    }
  }

  /*
    * put数据进首选项    首选项的put函数  如果对应key 有值就是替换  没值就是赋值
    * name 要存入哪一个首选项  name名称寻找
    * key 键值对 键
    * value 要存入的值preferences.ValueType  类型就是  string boolean number
  */
  async putPreferenceValue(name: string, key: string, value: preferences.ValueType){
    //判断 名称能否在 prefMap集合中找到
    if(!this.prefMap.has(name)){
      //如果找不到对应名称 说明  没有对应name 的首选项 那么 直接抛回去
      console.log('testTag',`Preferences[${name}]尚未初始化!`)
      return
    }
    //如果name 在首选项中是存在的  通过 this.prefMap.get(name) 获取到存入的首选项对象
    let pref = this.prefMap.get(name);
    // 然后调用它的 put 将键值对存进去
    await pref.put(key,value);
    //对象刷盘
    await pref.flush()
    console.log('testTag',`保存Preferences[${name}.${key} = ${value}]成功`)
  }

  /*
    * 通过name名称与key键 defaultValue默认值
    * get获取指定首选项中指定key的值
  */
  async getPreferenceValue(name: string, key: string, defaultValue: preferences.ValueType){
    //判断 名称能否在 prefMap集合中找到
    if(!this.prefMap.has(name)){
      //如果找不到对应名称 说明  没有对应name 的首选项 那么 直接抛回去
      console.log('testTag',`Preferences[${name}]尚未初始化!`)
      return
    }
    //如果name 在首选项中是存在的  通过 this.prefMap.get(name) 获取到存入的首选项对象
    let pref = this.prefMap.get(name);
    /*
        * 调用 首选项实例的 get 函数  传入 key与默认值 就是我们传入的 defaultValue
        * 然后get就会返回  首选项中存的真正的值 然后我们直接将结果return回去
    */
    return await pref.get(key,defaultValue);
  }
  deleteference(name: string, key: string) {
    //判断 名称能否在 prefMap集合中找到
    if(!this.prefMap.has(name)){
      //如果找不到对应名称 说明  没有对应name 的首选项 那么 直接抛回去
      console.log('testTag',`Preferences[${name}]尚未初始化!`)
      return
    }
    //如果name 在首选项中是存在的  通过 this.prefMap.get(name) 获取到存入的首选项对象
    let pref = this.prefMap.get(name);
    try {
      //通过首选项实例调用delete 删除指定key
      pref.delete(key)
    }catch(e) {
      //操作失败 输出原因
      console.log('testTag',`Preferences[${name}.${key}]删除失败`,JSON.stringify(e))
    }
  }
}

//new 一个PreferencesUtil类的实力对象
const preferencesUtil = new PreferencesUtil()
//将实力对象导出
export default preferencesUtil as PreferencesUtil

我感觉自己注释已经写的超级认真了

反正就是 一开始 要preferences.getPreferences 初始化 对应name 的首选项实例
然后 通过实例 可以put 加入 键值
get 获取值
delete 删除键值对

然后 我们在模块入口的 onCreate 生命周期中 去写这个初始化的逻辑
在这里插入图片描述
这里 我们导入 自己写的 PreferencesUtil
然后调用它的 getPreferences
第一个参数 是 Ability 上下文中 AbilityContext
第二个参数 是首选项的name 名称
如果有多个 就可以 执行多次 创建不同name的
如下图 因为是异步的 所以 要用 async和await 处理成同步的
在这里插入图片描述
我们 index 首页 可以这样写

import PreferencesUtil from "../utils/PreferencesUtil"
@Entry
@Component
struct Dom {

  @State fontSize:number = 0;

  async aboutToAppear(){
    await PreferencesUtil.putPreferenceValue("grKey","name",112)
    this.fontSize = await PreferencesUtil.getPreferenceValue("grKey","name",12) as number;
  }

  build() {
    Column({space: 30}) {
        Text("getPreferenceValue值为"+this.fontSize)
    }
    .width('100%')
    .height('100%')
  }
}

先 put 加数据 然后 get 获取这个数据
然后用 Text 组件 输出它的值 看看有没有问题

我们 真机运行 这个值就出来了
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/433709.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Matlab在同一张图中如何加入多个图例

根据代码最终画出的图片如下&#xff1a; 其实原理很简单&#xff0c;就是在一张figure中画多个坐标轴&#xff0c;每个坐标轴都有对应的图例&#xff0c;之后再将多余坐标轴隐藏&#xff0c;只保留一个即可。 代码如下&#xff1a; clear all; close all;dd_linewidth 1;a …

VR全景数字工厂,制造业企业线上营销新助手

VR全景技术逐渐渗透到各行各业&#xff0c;其中&#xff0c;很多实体工厂的线上营销宣传也借助720云VR全景技术也迎来了新的变革。 一、VR全景技术的独特魅力 VR全景技术是一种基于虚拟现实技术的全新视觉呈现方式&#xff0c;能够为用户带来身临其境的沉浸式体验。通过VR全景…

Docker容器化解决方案(镜像,容器的操作管理)

Docker镜像管理 搜索官方仓库镜像 docker search [rootlocalhost ~]# docker search nginx NAME DESCRIPTION STARS OFFICIAL nginx Official build of Nginx. …

计算机mfc140.dll文件缺失的修复方法分析,一键修复mfc140.dll

电脑显示mfc140.dll文件缺失信息时&#xff0c;不必担心&#xff0c;这通常是个容易解决的小问题。接下来让我们详细探究并解决mfc140.dll文件缺失的状况。以下将详述相应的解决方案&#xff0c;从而帮助您轻松克服这一技术难题。通过几个简单步骤&#xff0c;即可恢复正常使用…

C语言项目实战——贪吃蛇

C语言实现贪吃蛇 前言一、 游戏背景二、游戏效果演示三、课程目标四、项目定位五、技术要点六、Win32 API介绍6.1 Win32 API6.2 控制台程序6.3 控制台屏幕上的坐标COORD6.4 GetStdHandle6.5 GetConsoleCursorInfo6.5.1 CONSOLE_CURSOR_INFO 6.6 SetConsoleCursorInfo6.7 SetCon…

LeetCode每日一题只 快乐数

目录 题目介绍&#xff1a; 算法原理&#xff1a; 鸽巢原理&#xff1a; 如何找到环里元素&#xff1a; 代码实现&#xff1a; 题目介绍&#xff1a; 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 算法原理&#xff1a; 我先简单举两个例子&#xff…

python大数据分析游戏行业中的 Apache Kafka:用例 + 架构!

python大数据分析游戏行业中的 Apache Kafka&#xff1a;用例 架构&#xff01; 这篇博文探讨了使用 Apache Kafka 的事件流如何提供可扩展、可靠且高效的基础设施&#xff0c;让游戏玩家开心并让游戏公司取得成功。讨论了游戏行业中的各种用例和架构&#xff0c;包括在线和移…

day04-SpringBootWeb入门

一、SpringBootWeb快速入门 1 需求 需求&#xff1a;基于 SpringBoot 的方式开发一个 web 应用&#xff0c;浏览器发起请求 /hello后&#xff0c;给浏览器返回字符串“Hello World ~”。 2 开发步骤 第1步&#xff1a;创建 SpringBoot 工程项目 第2步&#xff1a;定义 HelloC…

2024年k8s最新版本安装教程

k8s安装教程 1 k8s介绍2 环境搭建2.1 主机准备2.2 主机初始化2.2.1 安装wget2.2.2 更换yum源2.2.3 常用软件安装2.2.4 关闭防火墙2.2.5 关闭selinux2.2.6 关闭 swap2.2.7 同步时间2.2.8 修改Linux内核参数2.2.9 配置ipvs功能 2.3 容器安装2.3.1 设置软件yum源2.3.2 安装docker软…

Claude3、Gemini、Sora VS GPT-4:AI技术如何助力科研与产业发展?

【最新增加Claude3、Gemini、Sora、GPTs讲解及AI领域中的集中大模型的最新技术】 2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚…

【Java EE】文件内容的读写⸺数据流

目录 &#x1f334;数据流的概念&#x1f338;数据流分类 &#x1f333;字节流的读写&#x1f338;InputStream&#xff08;从文件中读取字节内容)&#x1f33b;示例1&#x1f33b;示例2&#x1f33b;利用 Scanner 进行字符读取 &#x1f338;OutputStream(向文件中写内容&…

阿里云重新更新系统导致秘钥失效

报错解决方案&#xff1a; ssh-keygen -f "/Users/pengzhanliang/.ssh/known_hosts" -R "39.105.149.49"这个命令会从~/.ssh/known_hosts文件中移除与IP地址39.105.149.49相关的所有条目 再次尝试连接到远程服务器。这次&#xff0c;SSH将提示您接受新的主…

简单、透明、安全、高度集成!龙蜥可信 SBOM 能力探索与实践

近两年&#xff0c;软件供应链有非常多安全事件&#xff0c;包括软件供应链的各个阶段开发、构建、交付、使用等每个环节都有很多的软件供应链的安全事件发生。在 2023 龙蜥操作系统大会全面建设安全生态分论坛上&#xff0c;阿里云技术专家郑耿、周彭晨分享了龙蜥社区在构建 S…

企业计算机服务器中了faust勒索病毒怎么解密,faust勒索病毒解密流程

网络在为企业提供便利的同时&#xff0c;也为企业的数据安全问题带来严重威胁&#xff0c;网络安全是众多企业关系的主要话题&#xff0c;近期&#xff0c;云天数据恢复中心接到一大波企业的求助&#xff0c;企业的计算机服务器都被faust后缀勒索病毒攻击&#xff0c;导致企业计…

Electron 多显示器渲染

Electron打出的包&#xff0c;如果当前有俩个显示器&#xff0c;则可以配置当前显示倒哪个显示器上&#xff0c;或者可以配置不同的显示器&#xff0c;启动不同的项目&#xff0c;只在Windows和Linux下测试过&#xff0c;Mac没有真机&#xff0c;可以利用docker安装MacOS环境&a…

Jmeter性能测试 -3数据驱动实战

什么是数据驱动&#xff1f; 从数据文件中读取测试数据&#xff0c;驱动测试过程的一种测试方法。数据驱动可以理解为更高级的参数化。 特点&#xff1a;测试数据与测试代码分离&#xff1b;数据控制过程 好处&#xff1a;降低开发和维护成本&#xff0c;减少代码量&#xf…

如何做代币分析:以 LDO 币为例

作者&#xff1a;lesleyfootprint.network 编译&#xff1a;mingfootprint.network 数据源&#xff1a;LDO 代币仪表板 &#xff08;仅包括以太坊数据&#xff09; 在加密货币和数字资产领域&#xff0c;代币分析起着至关重要的作用。代币分析指的是深入研究与代币相关的数据…

数字社交时代的引领者:Facebook的元宇宙探索

引言&#xff1a; 在当今数字社交时代&#xff0c;人们的社交方式正在经历着翻天覆地的变化。随着虚拟现实技术的不断发展和元宇宙概念的崛起&#xff0c;社交网络正朝着一个全新的未来迈进。作为全球最大的社交网络平台之一&#xff0c;Facebook正在积极探索元宇宙时代的社交…

理解npm run dev 和 npm run serve的区别

文章目录 1. 分析npm run2. dev与serve的区别 1. 分析npm run npm npm 是 Node.js 的包管理器&#xff0c;它允许你安装、更新、删除和管理 Node.js 的模块和应用程序。 run run 是 npm 的一个子命令&#xff0c;用于执行在 package.json 文件的 scripts 部分定义的脚本。 dev…

C++初阶篇----类与对象下卷

目录 1.再谈析构函数1.1构造函数体赋值1.2 初始化列表1.3 explicit关键字 2.Static成员2.1概念2.2 特性 3.友元3.1 概念3.2友元函数3.3 友元类 4.内部类4.1 概念 5.匿名对象5.1 概念 6.拷贝对象时的一些编译器优化7.再次理解封装 1.再谈析构函数 1.1构造函数体赋值 在对类的实…