HarmonyOS 数据持久化之首选项 preferences

news2024/10/6 4:07:31

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

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

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 组件 输出它的值 看看有没有问题

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

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

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

相关文章

Android开发新手入门教程,android笔试面试题

前言 尤其是在最近一段时间内&#xff0c;感觉一天天的时间过得又慢又快&#xff0c;慢的是感觉复工了以后在公司的8.9个小时简直算是煎熬了&#xff0c;快的是常常感觉时间一天天&#xff0c;一月月的过去了&#xff0c;可是发现自己还在原路踏步走。看似每天忙成狗&#xff…

【数学建模】层次分析

1.建立递阶层次结构模型 2.构造出各层次中的所有判断矩阵 对指标的重要性进行两两比较&#xff0c;构造判断矩阵&#xff0c;科学求出权重 矩阵中元素aij的意义是&#xff0c;第i个指标相对第j个指标的重要程度 对角线1&#xff0c;aijaji1 矛盾——>一致性检验

win11配置Mask DINO小白踩坑记录

win11配置Mask DINO踩坑记录 1 准备工作2 创建python环境和安装detectron22.1 安装前提2.2 安装流程2.2.1 cl.exe的错误2.2.2 SetuptoolsDeprecationWarning的错误 3 MaskDINO运行3.1 运行demo 前情提要&#xff1a;需要复现Mask DINO&#xff0c;但是实验室没有Linux的电脑&am…

+++

解法&#xff1a; 显然a可以为aik&#xff08;i为整数&#xff09;&#xff0c;b可以为bjk(j为整数&#xff09;。 若aikbjk。假定i>j&#xff0c;那么a<b。可以得到b-a(i-j)k 我是傻逼&#xff0c;不放代码了 #include<iostream> #include<vector> #inc…

Tomcat基础与Nginx的动静分离

一、TOMCAT基础功能 &#xff08;一&#xff09;自动解压war包 在配置文件中讲到&#xff0c;当接受到请求后&#xff0c;会匹配符合要求的Host&#xff0c;在配置文件中的Host只有一个&#xff0c;且规定了自动解压war包 自动解压war包 .war&#xff1a;WebApp打包,类zip格…

【ESP32 IDF】SPI层次结构SPI协议与SPI控制器结构

文章目录 前言一、SPI 程序层次1.1 硬件原理图1.2 硬件框图1.3 软件层次 二、SPI协议2.1 硬件连线2.2 如何访问SPI设备2.3 SPI 框图 总结 前言 SPI&#xff08;Serial Peripheral Interface&#xff09;是一种常见的串行通信协议&#xff0c;用于在微控制器和外部设备之间进行…

Qt QtCreator打开pro项目时出现假死现象

在Windows系统下&#xff0c;QtCreator打开pro项目时出现假死现象&#xff0c;左侧项目树形图无法展开&#xff0c;项目根节点一直在转圈。尝试关掉所有QtCreator进程&#xff0c;重新打开pro也是无济于事。 解决方案&#xff1a; 打开“运行”窗口&#xff08;快捷键&#x…

鸿蒙文章专题-2021年鸿蒙相关的文章废弃

#原因 至于为什么说2021年我的鸿蒙专栏的文章废弃了&#xff0c;只是说没有了参考意义&#xff0c;是因为鸿蒙4.0以前的版本语言从以Java为主过渡为以ArkTS为主。以前的Java版本的工程已经无法再使用了&#xff0c;后续的开发都必须以ArkTS开发语言为主。 其中而且整个项目结构…

操作教程|使用MeterSphere对恒生UFX系统进行压力测试

恒生UFX&#xff08;United Finance Exchange&#xff0c;统一金融交换&#xff09;系统&#xff08;以下简称为“UFX系统”&#xff09;&#xff0c;是一款帮助证券公司统一管理外部接入客户的系统&#xff0c;该系统整体上覆盖了期货、证券、基金、银行、信托、海外业务等各类…

Python 服务实现可观测性最佳实践

前言 本次实践主要是介绍 Python 服务通过无侵入的方式接入观测云进行全面的可观测。 环境信息 系统环境&#xff1a;主机环境开发语言&#xff1a;Python2.7APM 探针包&#xff1a;ddtrace 接入方案 准备工作 安装 DataKit 主机安装 DataKit # 需要把token 改成观测云…

xss.haozi.me靶机 通关

0x00 没有任何过滤可以直接注入<img srcx οnerrοralert(1)> 0x01 使用了testarea标签将我们的输入内容以普通的字符串进行展示 但是我们可以将标签进行闭合 </textarea><img srcx οnerrοralert(1)> 0x02 我们依然可以先闭合之后添加属性a" οncl…

Mendix 使用OIDC组件实现SSO|Azure Microsoft Entra ID 集成(原名:AD)

引言 在快节奏的软件开发领域&#xff0c;Mendix作为一款领先的低代码开发平台&#xff0c;为企业提供了快速构建、部署和迭代应用程序的能力。这种灵活性和效率使得Mendix成为了推动数字化转型的强大工具。随着企业应用数量的激增&#xff0c;单点登录&#xff08;SSO&#x…

【debug】element-ui时间控件回显后不可编辑且显示为空

问题&#xff1a;使用element-ui的时间控件回显数据&#xff0c;编辑数据没有反应&#xff1a;点时间和“确认”按钮都没反应。 输入框中会显示数据&#xff0c;但提交时的校验显示为空。 <el-form-item label"开始时间" prop"limitStartTime"><…

【数据结构】堆的TopK问题

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解堆的TopK问题&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 一. 前言二. TopK三. 代码 一. 前言 TOP-K问题&#xff1a;即求数据结合中前K个最大的元…

专业145+总分410+西工大西北工业大学827信号与系统考研经验电子信息与通信工程,海航,真题,大纲,参考书。

经过一年的努力&#xff0c;分数终于出来。今年专业课827信号与系统145&#xff08;很遗憾差了一点点满分&#xff0c;没有达到Jenny老师的最高要求&#xff09;&#xff0c;数一130&#xff0c;英语和政治也都比较平衡&#xff0c;总分410分&#xff0c;当然和信息通信考研Jen…

类变量和类方法【静态变量 static】

类变量和类方法【静态变量 static】 类变量什么是类变量如何定义类变量如何访问类变量类变量使用注意事项和细节 类方法类方法的基本介绍类方法的调用类方法应用案例类方法经典的使用场景类方法使用注意事项和细节 类变量 什么是类变量 类变量&#xff0c;也叫静态属性/静态变…

Vue点击切换组件颜色

例如我有一个这样的组件&#xff0c;我希望在点击组件之后由蓝色变成橙色 先把原来的代码附上(简化掉了叉号&#xff09;&#xff1a; <div v-for"(item, index) in words" :key"index" class"scrollbar-demo-item"><span>{{ item …

一次奇特的应急响应

访问polling.oastify.com 今天&#xff08;2024/3/5&#xff09;在深信服防火墙用户安全日志页面&#xff0c;检测到我的主机在和polling.oastify.com域名进行通信 当时通知我检查我的主机&#xff0c;慌得一批&#xff0c;检查完后可能认为是我代理的问题&#xff0c;把代理关…

YOLOv7独家原创改进:特征融合涨点篇 | 广义高效层聚合网络(GELAN) | YOLOv9

💡💡💡本文独家改进:即结合用梯度路径规划(CSPNet)和(ELAN)设计了一种广义的高效层聚合网络(GELAN),高效结合YOLOv7,实现涨点。 将GELAN添加在backbone和head处,提供多个yaml改进方法 💡💡💡在多个私有数据集和公开数据集VisDrone2019、PASCAL VOC实现…

国产嵌入式DSP教学实验箱_操作教程:22-AD采集DA输出实验(采集输出正弦波)

一、实验目的 掌握EMIFA、SPI的使用&#xff0c;了解AD7606、AD5724的芯片特性和使用&#xff0c;并实现基于AD7606采集、AD5724输出正弦波。 二、实验原理 StarterWare StarterWare是一个免费的软件开发包&#xff0c;它包含了示例应用程序。StarterWare提供了一套完整的G…