【鸿蒙 HarmonyOS 4.0】数据持久化

一、数据持久化介绍

数据持久化是将内存数据(内存是临时的存储空间),通过文件或数据库的形式保存在设备中。

HarmonyOS提供两种数据持久化方案:

1.1、用户首选项(Preferences):

通常用于保存应用的配置信息。数据通过文本的形式保存在设备中,应用使用过程中会将文本中的数据全量加载到内存中,所以访问速度快、效率高,但不适合需要存储大量数据的场景。

1.2、数据库:

键值型数据库(KV-Store):一种非关系型数据库,其数据以“键值”对的形式进行组织、索引和存储,其中“键”作为唯一标识符。适合很少数据关系和业务关系的业务数据存储,同时因其在分布式场景中降低了解决数据库版本兼容问题的复杂度,和数据同步过程中冲突解决的复杂度而被广泛使用。相比于关系型数据库,更容易做到跨设备跨版本兼容。

关系型数据库(RelationalStore):一种关系型数据库,以行和列的形式存储数据,广泛用于应用中的关系型数据的处理,包括一系列的增、删、改、查等接口,开发者也可以运行自己定义的SQL语句来满足复杂业务场景的需要。

二、通过用户首选项实现数据持久化

使用场景:用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。

说明:

①Key键为string类型,要求非空且长度不超过80个字节。

②Value可以是string、number、boolean及以上类型数组,大小不超过8192字节

③数据量建议不超过一万条

2.1、基本案例

2.1.1、案例代码

@Entry
@Component
struct Index {@State message: string = '页面列表'@State showPanel: boolean = false@Provide fontSize: number = 16build() {Column(){// 顶部标题this.Title()// 导航列表this.RouterList()// 字体修改面板if(this.showPanel){IndexFontSizePanel().transition({translate: { y: 115 }})}}.width('100%').height('100%')}@Builder Title(){Row() {Text(this.message).fontSize(50).fontWeight(FontWeight.Bold).height(80)Image($r('app.media.ic_public_settings')).width(30).onClick(() => {animateTo({ duration: 500, curve: Curve.EaseOut }, () => this.showPanel = !this.showPanel)})}.justifyContent(FlexAlign.SpaceAround).width('100%')}@Builder RouterList() {List({ space: 15 }) {ForEach(['导航','屏幕','图片','图书','书架'],(item,index) => {ListItem() {Row(){Text((index+1) + '.').fontSize(this.fontSize).fontColor(Color.White)Blank()Text(item).fontSize(this.fontSize).fontColor(Color.White)}.width('90%').padding(12).backgroundColor('#38f').borderRadius(20).shadow({radius: 6, color: '#4F000000', offsetX: 2, offsetY: 4})}})}.layoutWeight(1).alignListItem(ListItemAlign.Center).width('100%')}
}@Component
struct IndexFontSizePanel {@Consume fontSize: numberfontSizLabel: object = {14: '小',16: '标准',18: '大',20: '特大',}build() {Column() {Text(this.fontSizLabel[this.fontSize]).fontSize(20)Row({ space: 5 }) {Text('A').fontSize(14).fontWeight(FontWeight.Bold)Slider({min: 14,max: 20,step: 2,value: this.fontSize}).showSteps(true).trackThickness(6).layoutWeight(1).onChange(val => {// 修改字体大小this.fontSize = val})Text('A').fontSize(20).fontWeight(FontWeight.Bold)}.width('100%')}.width('100%').padding(15).backgroundColor('#fff1f0f0').borderRadius(20)}
}

2.1.2、案例效果:

案例说明:

这是一个页面列表展示案例,点击右上角的设置按钮,底部会弹出字体修改面板,字体有4个不同的大小(小/标准/大/特大),当点击滑动条可以修改字体大小

目前更改了滑动条的字体大小数据是保存在内存的,关闭页面后再进来数据显示默认大小,现在是想通过用户首选项实现数据持久化,持久化保存设置的字体大小

2.2、具体实现

2.2.1、定义用户首选项操作文件

import preferences from '@ohos.data.preferences';class PreferencesUtil{prefMap: Map<string, preferences.Preferences> = new Map()async loadPreference(context, name: string){try { // 加载preferenceslet pref = await preferences.getPreferences(context, name)this.prefMap.set(name, pref)console.log('testTag', `加载Preferences[${name}]成功`)} catch (e) {console.log('testTag', `加载Preferences[${name}]失败`, JSON.stringify(e))}}async putPreferenceValue(name: string, key: string, value: preferences.ValueType){if (!this.prefMap.has(name)) {console.log('testTag', `Preferences[${name}]尚未初始化!`)return}try {let pref = this.prefMap.get(name)// 写入数据await pref.put(key, value)// 刷盘await pref.flush()console.log('testTag', `保存Preferences[${name}.${key} = ${value}]成功`)} catch (e) {console.log('testTag', `保存Preferences[${name}.${key} = ${value}]失败`, JSON.stringify(e))}}async getPreferenceValue(name: string, key: string, defaultValue: preferences.ValueType){if (!this.prefMap.has(name)) {console.log('testTag', `Preferences[${name}]尚未初始化!`)return}try {let pref = this.prefMap.get(name)// 读数据let value = await pref.get(key, defaultValue)console.log('testTag', `读取Preferences[${name}.${key} = ${value}]成功`)return value} catch (e) {console.log('testTag', `读取Preferences[${name}.${key} ]失败`, JSON.stringify(e))}}
}const preferencesUtil = new PreferencesUtil()export default preferencesUtil as PreferencesUtil

2.2.2、将数据加载到Preferences实例,用于数据操作。

放入应用启动时来操作,找到EntryAbility文件,在onCreate应用创建时,加载Preferences实例

2.2.3、Index页面使用

第一步:一进入首页就进行读取

使用页面生命周期aboutToAppear来执行

第二步:修改字体大小时写入Preferences

最后:👏👏😊😊😊👍👍 

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

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

相关文章

android 全局异常处理封装

app出现了问题&#xff0c;尤其是多线程问题&#xff0c;某个线程出了问题&#xff0c;很不好找&#xff0c;那是不是可以搞一个统一的处理类&#xff0c;将所有的异常信息都统一到一个地方呢&#xff0c;原本只是一个知识点&#xff0c;但我发现这里还可以 保存异常信息到本地…

Vue 进阶系列丨实现简易reactive和ref

Vue 进阶系列教程将在本号持续发布&#xff0c;一起查漏补缺学个痛快&#xff01;若您有遇到其它相关问题&#xff0c;非常欢迎在评论中留言讨论&#xff0c;达到帮助更多人的目的。若感本文对您有所帮助请点个赞吧&#xff01; 2013年7月28日&#xff0c;尤雨溪第一次在 GItHu…

计算机网络Day02--物理层(一)

计算机网络Day02–物理层 物理层基本概念 物理层考虑的是怎么才能在连接各种计算机的传输媒体上传输比特流&#xff0c;而不是具体的传输媒体 作用&#xff1a;尽可能屏蔽掉不同传输媒体和通信手段的差异 用于物流层的协议也称为物流层规程 主要作用&#xff1a;解决计算机…

COCI2015-2016#1 RELATIVNOST

P6533 [COCI2015-2016#1] RELATIVNOST 题目大意 小 L L L在卖画。这些画分为彩色画和黑白画&#xff0c;小 L L L希望有至少 c c c个人会买走他至少一张彩色画。 第 i i i个人至多会购买 a i a_i ai​张彩色画或者 b i b_i bi​张黑白画&#xff0c;且每个人至少购买一张画。…

Android---Jetpack Compose学习007

Compose 附带效应 a. 纯函数 纯函数指的是函数与外界交换数据只能通过函数参数和函数返回值来进行&#xff0c;纯函数的运行不会对外界环境产生任何的影响。比如下面这个函数&#xff1a; fun Add(a : Int, b : Int) : Int {return a b } “副作用”&#xff08;side effe…

单例模式的介绍

单例模式&#xff08;Singleton&#xff09;是一种创建型设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供全局访问点。其核心思想是通过限制类的实例化次数&#xff0c;防止多个实例同时存在&#xff0c;从而避免了多线程竞争和资源浪费&#xff0c;提高了代码…

【蓝桥杯单片机入门记录】静态数码管

目录 一、数码管概述 &#xff08;1&#xff09;认识数码管 &#xff08;2&#xff09;数码管的工作原理 &#xff08;3&#xff09;LED数码管驱动方式-静态显示 二、数码管电路图 三、静态数码管显示例程 &#xff08;1&#xff09;例程1&#xff1a;数码管显示某一位&a…

vue、thinkphp实现腾讯云对象存储COS图片上传

环境&#xff1a; thinkphp6 vue2 vant2.12 composer安装qcloud-sts-sdk composer require qcloud_sts/qcloud-sts-sdk获取COS临时id、key的sts接口 <?php declare (strict_types 1);namespace app\index\controller; use QCloud\COSSTS\Sts;class CosController {//h…

如何为PostgreSQL设置自增主键?

在 PostgreSQL 中&#xff0c;自增主键通常是通过使用 SERIAL 类型或在新版本中使用 IDENTITY 列来实现的。 1. 使用 SERIAL 类型 SERIAL 是一个自动增加的整数&#xff0c;常用于主键。当插入新的行时&#xff0c;PostgreSQL 会自动为这个列生成一个新的值。   例如 CREAT…

PYQT5-自定义事件

from PyQt5.QtCore import QEvent, QObject from PyQt5.QtWidgets import QApplication import sys# 自定义事件类 class CustomEvent(QEvent):# PYQT5 预留给用户自定义事件类型的起点为 QEvent.User1000custom_event_type QEvent.registerEventType()# 也可以这样写# custom…

2024.2.22

P1162 #include<map> #include<vector> #include<iostream> #include<math.h> #include<algorithm> #include<string> using namespace std; const int N 1020; int n; int g[N][N];//标记数组 int a[N][N];//储存数组 int dx[] { -1…

webstorm光标变成方块解决办法_webstorm光标变粗不能换行

webstorms光标变了 键盘上的insert是切换的快捷键&#xff0c;敲insert就可以来回切换了

回顾 | Java面向对象 多态篇

多态是面向对象编程中的一个重要概念&#xff0c;它允许不同的对象对同一消息做出不同的响应。 通过多态&#xff0c;可以通过父类或接口定义的引用变量来操作子类或实现类的对象&#xff0c;从而实现同一方法在不同对象上的不同行为。 在Java中&#xff0c;多态性主要通过继…

双通道并行网络,想用哪个网络用哪个,MATLAB代码

本期可谓是宝藏篇&#xff01;学会本期的思想&#xff0c;帮助你分分钟找到创新点&#xff0c;且不与别人重复&#xff01; 本期采用MATLAB代码&#xff0c;实现一种“基于格拉姆角场与并行CNN的故障诊断方法”。该方法的具体实现可以参考文献&#xff1a; [1]李宗源,陈谦,钱…

React native更改包名后,启动app的activity包名不生效问题

这篇文章本不算记录的&#xff0c;因为实际开发中&#xff0c;类似这种小问题会有很多很多&#xff0c;因为导致问题的原因千奇百怪&#xff0c;解决方案也不尽相同&#xff0c;所以也都没有记录。 但今天看到我10年写的问题解决小文章&#xff0c;被网友收藏了&#xff0c; 感…

普中51单片机学习(EEPROM)

EEPROM IIC串行总线的组成及工作原理 I2C总线的数据传送 数据位的有效性规定 I2C总线进行数据传送时&#xff0c;时钟信号为高电平期间&#xff0c;数据线上的数据必须保持稳定&#xff0c;只有在时钟线上的信号为低电平期间&#xff0c;数据线上的高电平或低电平状态才允许…

分享WebGL物体三维建模

界面效果 代码结构 模型素材类似CT (Computed Tomography)&#xff0c;即电子计算机断层扫描&#xff0c;它是利用精确准直的X线束、γ射线、超声波等&#xff0c;与灵敏度极高的探测器一同围绕物体的某一部位作一个接一个的断面扫描。 坐标系统 渲染流程 渲染流程是个将之前准…

Sora:OpenAI引领AI视频新时代

Sora - 探索AI视频模型的无限可能 随着人工智能技术的飞速发展&#xff0c;AI视频模型已成为科技领域的新热点。而在这个浪潮中&#xff0c;OpenAI推出的首个AI视频模型Sora&#xff0c;以其卓越的性能和前瞻性的技术&#xff0c;引领着AI视频领域的创新发展。让我们将一起探讨…

C++(12) 模板类、模板继承(严格模式和自由模式)

文章目录 模版类1. 模版类2. 模版参数限制3. 模版继承3.1 严格模式3.2 自由模式 4. 模版类的模版函数5. 返回值类型带有模版 模版类 1. 模版类 #include <iostream>using namespace std;/* 当前 Person 类型&#xff0c;声明了连个模版分别对应NameType 模版类型&#…

C++ array容器用法详解

array 容器是 C++ 11 标准中新增的序列容器,简单地理解,它就是在 C++ 普通数组的基础上,添加了一些成员函数和全局函数。在使用上,它比普通数组更安全(原因后续会讲),且效率并没有因此变差。 和其它容器不同,array 容器的大小是固定的,无法动态的扩展或收缩,这也就意…