ArkTS - 数据持久化

一、概述

应用数据持久化,是指应用将内存中的数据通过文件或数据库的形式保存到设备上。内存中的数据形态通常是任意的数据结构或数据对象,存储介质上的数据形态可能是文本、数据库、二进制文件等。 

持久(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的数据存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。 

HarmonyOS标准系统支持典型的存储数据形态,包括用户首选项、键值型数据库、关系型数据库。

  • 用户首选项(Preferences):通常用于保存应用的配置信息。数据通过文本的形式保存在设备中,应用使用过程中会将文本中的数据全量加载到内存中,所以访问速度快、效率高,但不适合需要存储大量数据的场景。
  • 键值型数据库(KV-Store):一种非关系型数据库,其数据以“键值”对的形式进行组织、索引和存储,其中“键”作为唯一标识符。适合很少数据关系和业务关系的业务数据存储,同时因其在分布式场景中降低了解决数据库版本兼容问题的复杂度,和数据同步过程中冲突解决的复杂度而被广泛使用。相比于关系型数据库,更容易做到跨设备跨版本兼容。
  • 关系型数据库(RelationalStore):一种关系型数据库,以行和列的形式存储数据,广泛用于应用中的关系型数据的处理,包括一系列的增、删、改、查等接口,开发者也可以运行自己定义的SQL语句来满足复杂业务场景的需要。

二 、用户首选项

用户首选项(Perference)为应用提供 key-value 键值型的数据处理能力,支持应用持久化轻量级数据

说白了,用户首选项就是用来保存和记录用户在操作应用的过程做做出的一些选择或设置。 可以存储一些数据,但基本都是简单类型的数据,主要作用都是存储一些用户设置数据,比如是否是首次登陆,就可以设置一个布尔类型的变量,设值为true或false。

你可以粗暴的将它看作类似于redis的以键值对存储的本地非关系型数据库(NoSql),这样方便你使用与理解。

再或者你可以将它想象成一个用来存储数据的仓库/中转站,可以跨组件的使用这些数据

约束限制 

  • Key键为string类型,要求非空且长度不超过80个字节。
  • 如果Value值为string类型,可以为空,不为空时长度不超过8192个字节。
  • 内存会随着存储数据量的增大而增大,所以存储的数据量应该是轻量级的,建议存储的数据不超过一万条,否则会在内存方面产生较大的开销。

使用步骤

1、导入用户首选项模块

import preferences from '@ohos.data.preferences'

2、获取Perferences实例,读取指定文件

preference.getPreferences(this.context,"MyAppPreferences").then(preferences => {//获取成功}).catch(reason => {//获取失败})

3、 数据操作

//写入数据,如果已经存在则会覆盖,可以利用.has()判断是否存在
preferences.put('key',val).then(() => {preferences.flush() //刷到磁盘中}).catch(reason => {})  //处理异常//删除数据
preferences.delete('key').then(() => {}).catch(reason => {})//查询数据,defaultValue是默认值,没有值时就返回这个
preferences.get('key','defaultValue').then(value => {}).catch(reason => {})

封装工具类

我们可以将这些功能封装成一个工具类

import preferences from '@ohos.data.preferences'class PreferencesUtil {//map集合存储多个不同的preferencepreferencesMap: Map<string, preferences.Preferences> = new Map;//加载一个preferenceloadPreference(context, name: string) {//返回值是一个Promise包裹起来的preference,因此可以使用链式回调函数处理preferences.getPreferences(context, name).then(preference => {this.preferencesMap.set(name, preference)console.log('testTag', `加载Preference [${name}]成功`);}).catch(reason => {console.log('testTag', `加载Preference [${name}]失败`, JSON.stringify(reason));})}//获取指定preference并存入键值对数据async putPreferenceValue(name: string, key: string, value: preferences.ValueType) {if (!this.preferencesMap.has(name)) {console.log('testTag', `Preference[${name}]尚未初始化`);//结束异步return}try {let preference = this.preferencesMap.get(name)//写入数据await preference.put(key, value)//刷新磁盘preference.flush()console.log('testTag', `保存Preferences[${name}:${key}=${value}]成功`)} catch (e) {console.log('testTag', `保存Preferences[${name}.${key}=${value}]失败`, JSON.stringify(e));}}//获取指定preference的指定数据async getPreferenceValue(name: string, key: string, defaultValue: preferences.ValueType) {if (!this.preferencesMap.has(name)) {console.log('testTag', `Preference[${name}]尚未初始化`);//结束异步return}try {let preference = this.preferencesMap.get(name)//读数据let value = await preference.get(key, defaultValue)console.log('testTag', `获取Preferences[${name}:${key}=${value}]成功`)return value} catch (e) {console.log('testTag', `获取Preferences[${name}.${key}]失败`, JSON.stringify(e));}}//删除指定preference的指定数据async deletePreferenceValue(name: string, key: string, defaultValue: preferences.ValueType) {return isPreferencesHas(this.preferencesMap, name);try {let preference = this.preferencesMap.get(name)//删除数据preference.delete(key)console.log('testTag', `删除Preferences[${name}.${key}]成功`)} catch (err) {console.log('testTag', `删除Preferences[${name}.${key}]失败`)}}
}const isPreferencesHas = function (preferenceMap: Map<string, preferences.Preferences>, name) {if (!this.preferencesMap.has(name)) {console.log('testTag', `Preference[${name}]尚未初始化`);//结束异步return}
}const preferencesUtil = new PreferencesUtil()export default preferencesUtil as PreferencesUtil

示例 

在使用preferences之前肯定要先加载一个preference实例,然后才能使用接下来的增删查功能。

既然要加载,肯定不能是像之前那样让用户点个按钮触发创建,而是最好程序已启动就自动隐式的创建,所以使用生命周期的钩子函数onCreate()方法(其实就相当于Vue的onMount()钩子函数)

在EntryAbility文件中调用加载preference即可

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

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

相关文章

vue3组件传参

1、props: 2、自定义事件子传父 3、mitt任意组件通讯 4、v-model通讯(v-model绑定在组件上) (1)V2中父子组件的v-model通信&#xff0c;限制了popos接收的属性名必须为value和emit触发的事件名必须为input,所以有时会有冲突; 父组件: 子组件: (2)V3中:限制了popos接收的属性名…

2024年1月2日-1月7日(ue5底层渲染+ue arpg+项目需求)

按照月计划&#xff0c;按照每小时分四段进行&#xff0c;arpg一例ue5底层渲染0.1小时arpg一例项目需求的相关视频教程一段 周二&#xff1a; 18&#xff1a;30- 19:30&#xff08;1小时&#xff09;ue arpg (88-89) ue5底层渲染03A14&#xff08;6&#xff1a;08&#xff09;…

sv数据类型

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、内建数据类型 一、内建数据类型 相应于verilog将变量类型&#xff08;如reg&#xff09;和线网类型&#xff08;如wire&#xff09;区分得如此清楚&#xff0c…

el-table魔改样式出现BUG,表格内容区域出现滚动条

问题&#xff1a;el-table表格内容区域在高度自适应的情况下冒出滚动条 解决办法&#xff1a; 代码排查后发现时我设置了fixed:“xxx” 属性就会导致滚动条出现的问题&#xff0c;不设置则无。 [{ type: index, label: 序号, fixed: left },{ prop: enterprisesName, label: …

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -全局异常统一处理实现

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

Windows安装SonarQube9.9

系统&#xff1a;Windows Server 2019 应用版本&#xff1a;SonarQube 9.9.3 数据库&#xff1a;SQL Server 2019 Java&#xff1a;JDK 17 下载 官网下载&#xff1a;https://www.sonarsource.com/products/sonarqube/downloads/ CSDN免费资源下载(社区版)&#xff1a;https:…

leetcode回溯问题总结 Python

目录 一、理论基础 二、例题 1. 排列问题 &#xff08;1&#xff09;无重复元素的排列问题 &#xff08;2&#xff09;有重复元素的排列问题 2. 组合问题 &#xff08;1&#xff09;无重复元素的组合问题 &#xff08;2&#xff09;无重复元素的子集问题 &#xff08;…

SpikingJelly笔记之泊松编码

文章目录 前言一、泊松编码的原理二、生成符合泊松分布的脉冲序列三、SpikingJelly中的泊松编码四、Lena图像的泊松编码与还原1.原始图像2.图像编码3.图像还原 总结 前言 记录SpikingJelly中泊松编码的使用方法&#xff0c;对图像数据进行编码与还原 一、泊松编码的原理 基于…

AI实景无人直播项目:开启自动直播新时代,一部手机即可实现增长

在当今社会&#xff0c;直播已经成为了人们日常生活中不可或缺的一部分。无论是商家推广产品、明星互动粉丝还是普通人分享生活&#xff0c;直播已经渗透到了各行各业。然而&#xff0c;传统直播方式存在着一些不足之处&#xff0c;如需现场主持人操作、高昂的费用等。近年来&a…

62、python - 全手写搭建 resnet50 神经网络

如果将上篇文章中涉及到的算法都自己手写完一遍后,我们开始尝试利用自己手写的算法,搭建一个完整的 resnet50 神经网络。 网络结构就参考这个链接中的网络结构,是在之前下载模型的章节中,下载的模型。 为了搭建一个完整的神经网络,定义一个 Resnet 的类,这个类就包含 r…

【大数据进阶第三阶段之Datax学习笔记】使用阿里云开源离线同步工具DataX 实现数据同步

【大数据进阶第三阶段之Datax学习笔记】阿里云开源离线同步工具Datax概述 【大数据进阶第三阶段之Datax学习笔记】阿里云开源离线同步工具Datax快速入门 【大数据进阶第三阶段之Datax学习笔记】阿里云开源离线同步工具Datax类图 【大数据进阶第三阶段之Datax学习笔记】使用…

MYSQL篇--sql优化高频面试题

sql优化 1 如何定位及优化SQL语句的性能问题&#xff1f;创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因&#xff1f; 其实对于性能比较低的sql语句定位&#xff0c;最重要的也是最有效的方法其实还是看sql的执行计划&#xff0c;而对于mysql来说 它…

C/C++ 联合体

目录 联合体概述 联合体的内存分配 联合体大小计算 联合体概述 联合与结构非常的相似&#xff0c;主要区别就在于联合这两个字。 联合的特征&#xff1a;联合体所包含的成员变量使用的是同一块空间。 联合体定义 //联合类型的声明 union Un {char c;int i; }; //联合变量…

php将文本内容写入一个文件(面向过程写法)

一、封装2个函数&#xff0c;读写文件 /*** desc 读取文件内容* param string $filename* return array*/ private function readContent(string $filename): array {$text file_get_contents($filename);if (!$text) {return [];}$result json_decode($text,true);return…

x-cmd pkg | usql - SQL 数据库的通用交互界面

目录 简介首次用户功能特点竞品和相关作品进一步阅读 简介 “usql” 是一个基于命令行的数据库客户端工具&#xff0c;它允许用户连接和管理多种类型的数据库。usql可以在多个操作系统上运行&#xff0c;包括 Linux、macOS 和 Windows。它还具有插件系统&#xff0c;可以根据需…

Devtools热部署

1.添加Devtools jra <groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional> </dependency>2.添加plugin插件 <build><…

MySQL BufferPool精讲

缓存的重要性 我们知道&#xff0c;对于使用InnoDB作为存储引擎的表来说&#xff0c;不管是用于存储用户数据的索引&#xff08;包括聚簇索引和二级索引&#xff09;&#xff0c;还是各种系统数据&#xff0c;都是以页的形式存放在表空间中的&#xff0c;而所谓的表空间只不过…

vue绑定背景颜色或背景图片 和 nuxtjs动态设置background-image:

v-bind绑定样式表&#xff1a; ---------------------------------------------------------------------------------------------------- HTML写法: <div class"myItem" style"text-align:center; background-image:url(); background-size:auto 100% ;ba…

酷雷曼精彩亮相CMC 2023中国元宇宙大会,助力云上VR直播

12月23日&#xff0c;2023中关村论坛系列活动——CMC 2023中国元宇宙大会在石景山首钢园冰壶馆成功举办。酷雷曼VR作为元宇宙领域代表企业之一受邀出席会议&#xff0c;分享元宇宙技术研发成果及应用方案&#xff0c;并为大会提供VR直播技术支持。 大咖云集&#xff0c;共商元宇…

基于 HTTPS 协议配置 Git 连接 GitHub

文章目录 0.安装 Git1.注册 GitHub 账号2.配置 Git 的用户名和邮箱3.远程连接 GitHub 有两种传输协议4.基于 SSH 协议配置 Git 连接 GitHub5.基于 HTTPS 协议配置 Git 连接 GitHub5.1 创建 GitHub 个人访问令牌5.2 有两种方法将本地仓库和远程仓库关联起来5.2.1 第一种方法&…