当前位置: 首页 > news >正文

鸿蒙通过用户首选项实现数据持久化

鸿蒙通过用户首选项实现数据持久化

1.1 场景介绍

用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。当用户希望有一个全局唯一存储的地方,可以采用用户首选项来进行存储。Preferences会将该数据缓存在内存中,当用户读取的时候,能够快速从内存中获取数据,当需要持久化时可以使用flush接口将内存中的数据写入持久化文件中。Preferences会随着存放的数据量越多而导致应用占用的内存越大,因此,Preferences不适合存放过多的数据,也不支持通过配置加密,适用的场景一般为应用保存用户的个性化设置(字体大小,是否开启夜间模式)等。

2.1 运作机制

用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。当用户希望有一个全局唯一存储的地方,可以采用用户首选项来进行存储。Preferences会将该数据缓存在内存中,当用户读取的时候,能够快速从内存中获取数据,当需要持久化时可以使用flush接口将内存中的数据写入持久化文件中。Preferences会随着存放的数据量越多而导致应用占用的内存越大,因此,Preferences不适合存放过多的数据,也不支持通过配置加密,适用的场景一般为应用保存用户的个性化设置(字体大小,是否开启夜间模式)等。

  • 每个key的value的长度最大为8kb
  • 创建首选项-仓库的概念-应用可以有N个仓库,一个仓库中可以有N个key

image-20250302113249158

3.1 接口说明

接口名称及方法签名描述参数同步/异步类型约束条件
getPreferencesSync(context: Context, options: Options): Preferences获取 Preferences 实例context: 上下文对象
options: 配置选项
同步存在对应的异步接口
putSync(key: string, value: ValueType): void写入键值对(需调用 flush 持久化存储)key: 键名
value: 值(需满足 ValueType 类型要求)
同步存在异步接口
hasSync(key: string): boolean检查是否包含指定键的键值对key: 键名同步- 键名不能为空
- 存在异步接口
getSync(key: string, defValue: ValueType): ValueType获取键对应的值(若为空或类型不匹配则返回 defValuekey: 键名
defValue: 默认值
同步存在异步接口
deleteSync(key: string): void删除指定键的键值对key: 键名同步存在异步接口
flush(callback: AsyncCallback<void>): void将数据异步持久化到文件callback: 异步回调异步-
on(type: 'change', callback: Callback<string>): void订阅数据变更事件(在 flush 后触发)type: 事件类型(仅支持 'change'
callback: 回调函数(参数为变更的 key
--
off(type: 'change', callback?: Callback<string>): void取消订阅数据变更事件type: 事件类型('change'
callback: 可选回调函数
-若未指定 callback 则取消全部订阅
deletePreferences(context: Context, options: Options, callback: AsyncCallback<void>): void从内存移除实例并删除持久化文件(若有)context: 上下文对象
options: 配置选项
callback: 异步回调
异步-

4.1 开发步骤

1.导入@kit.ArkData模块。

import { preferences } from "@kit.ArkData";

2.获取preference实例,拿到仓库

getPreferenceSync接受两个参数,其中一个参数是context,另一个参数是options

  • context代表了用户的上下文,是ability的能力级,也是ability的一个环境,这个东西如果想要获取分两种情况

    1. 在ability中区获取 在onWindowStageCreate写入这行代码即可

        MyPreferenceClass.context = this.context
      
    2. 在UI界面去拿

      getContext(this)
      
  • options 是传递给 preferences.getPreferencesSync() 的配置对象,用于定义存储实例的仓库名称、安全模式等关键属性

  const store = preferences.getPreferencesSync(MyPreferenceClass.context||getContext(),{//拿到该名称的仓库,拿不到就会给你创建该名称的仓库,类似数据库name:'infoStore'})return store

3.创建增删改的方法

   //2.写入字段,持久化存储static async  putStore(info:string){const store = MyPreferenceClass.getStore()store.putSync('info',info)await store.flush()}//3.获取数据static getValue(){const store = MyPreferenceClass.getStore()const value = store.getSync('info','666666')return value}//4.删除数据static async deleteValue(){const store = MyPreferenceClass.getStore()//如果不加上flush操作,只是在内存中删除,需要加上flush操作才能写入磁盘!store.deleteSync('info')await store.flush()}//5.判断数据是否存在static judjeValue(val:string){const store = MyPreferenceClass.getStore()const value =  store.hasSync(val)return value}

4.测试代码

import { MyPreferenceClass } from './utils/MyPreferenceClass'@Entry
@Component
struct Mytest {// @State 实时更新@State currentValue: string = '今天天气真不错!'@State JudeValue: boolean = falsebuild() {//初始化默认值Column({ space: 10 }) {Text(this.currentValue)Text(this.JudeValue + '')Button('写入数据').onClick(() => {MyPreferenceClass.putStore('今天天气并不好')})Button('展示数据').onClick(() => {this.currentValue = MyPreferenceClass.getValue() as string})Button('删除数据').onClick(() => {MyPreferenceClass.deleteValue()})Button('是否展示该数据').onClick(() => {this.JudeValue = MyPreferenceClass.judjeValue('info')})}.height('100%').width('100%')}

img

相关文章:

鸿蒙通过用户首选项实现数据持久化

鸿蒙通过用户首选项实现数据持久化 1.1 场景介绍 用户首选项为应用提供Key-Value键值型的数据处理能力&#xff0c;支持应用持久化轻量级数据&#xff0c;并对其修改和查询。当用户希望有一个全局唯一存储的地方&#xff0c;可以采用用户首选项来进行存储。Preferences会将该…...

在Ubuntu中,某个文件的右下角有一把锁的标志是什么意思?

在Ubuntu中&#xff0c;某个文件的右下角有一把锁的标志是什么意思&#xff1f; 在 Ubuntu&#xff08;或其他基于 GNOME 文件管理器的 Linux 发行版&#xff09;中&#xff0c;文件或文件夹的右下角出现一把“锁”标志&#xff0c;通常表示 你当前的用户没有该文件/文件夹的写…...

7.1.1 计算机网络的组成

文章目录 物理组成功能组成工作方式完整导图 物理组成 计算机网络是将分布在不同地域的计算机组织成系统&#xff0c;便于相互之间资源共享、传递信息。 计算机网络的物理组成包括硬件和软件。硬件中包含主机、前端处理器、连接设备、通信线路。软件中包含协议和应用软件。 功…...

使用 Docker 部署 RabbitMQ 的详细指南

使用 Docker 部署 RabbitMQ 的详细指南 在现代应用程序开发中&#xff0c;消息队列系统是不可或缺的一部分。RabbitMQ 是一个流行的开源消息代理软件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;。本文将详细介绍如何使用 Docker 部署 RabbitMQ&#xf…...

岛屿的数量(BFS)

给你一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中)。 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外&#xff0c;你可以假设该网格的四条边均被水包…...

线上JVM OOM问题,如何排查和解决?

今天咱们来聊聊让无数 Java 开发者头疼的 JVM OOM&#xff08;Out Of Memory&#xff0c;内存溢出&#xff09;问题。在面试中&#xff0c;OOM 问题也是面试官的“心头好”&#xff0c;因为它能直接考察你对 JVM 的理解&#xff0c;以及你在实际问题面前的排查和解决能力。 一…...

Linux的缓存I/O和无缓存IO

一、I/O缓存的背景 I/O缓存是指在内存里开辟一块区域&#xff0c;存放用来接收用户输入和用于计算机输出的数据&#xff0c;以减小系统开销和提高外设效率。linux对IO文件的操作分为不带缓存的IO操作和带缓存的IO操作&#xff08;标准IO操作&#xff09;。为什么存在C标准I/O库…...

【弹性计算】弹性裸金属服务器和神龙虚拟化(三):弹性裸金属技术

弹性裸金属服务器和神龙虚拟化&#xff08;三&#xff09;&#xff1a;弹性裸金属技术 1.弹性裸金属技术背景1.1 传统 KVM 虚拟化系统导致 CPU 计算特性损失1.2 传统 KVM 虚拟化系统导致资源争抢不可避免1.3 传统 KVM 虚拟化系统导致 I/O 性能瓶颈 2.弹性裸金属技术实现2.1 VPC…...

【MySQL】(2) 库的操作

SQL 关键字&#xff0c;大小写不敏感。 一、查询数据库 show databases; 注意加分号&#xff0c;才算一句结束。 二、创建数据库 {} 表示必选项&#xff0c;[] 表示可选项&#xff0c;| 表示任选其一。 示例&#xff1a;建议加上 if not exists 选项。 三、字符集编码和排序…...

Hyper-V -docker-vmware 三者的关系

1. Docker 正常运行&#xff0c;需要启动Hyper-V &#xff0c;打开 hypervisorlaunchtype 2.VMware 正常时&#xff0c;需要关闭Hyper-V &#xff0c;关闭 hypervisorlaunchtype 2.1资源管理器->CPU 里要开启虚拟化 2.2 服务-停掉HV服务 2.3 控制面板 不勾选 2.4 …...

IP-----双重发布

目录 6.双重发布 1.重发布的作用 2.部署条件 1.必须存在ASBR 2.种子度量值 3.重发布的规则 4.重发布的数量 5.重发布的场景 1.场景和规则 2.直连和静态 3.动态RIP 4.动态OSPF 5.更改开销值 6.重发布的问题1 7.重发布的问题2 1.流量 2.前缀列表 3.偏移列表 4…...

【新立电子】探索AI眼镜背后的黑科技,FPC如何赋能实时翻译与语音识别,点击了解未来沟通的新方式!

在全球化的今天&#xff0c;语言障碍成为人们沟通与交流的一大难题。AI眼镜作为一种新兴的智能设备&#xff0c;正在通过实时翻译与语音识别功能&#xff0c;打破语言壁垒&#xff0c;为人们提供无缝沟通的解决方案。FPC在AI眼镜中的应用&#xff0c;为实时翻译与语音识别功能的…...

LeetCode 热题 100_寻找两个正序数组的中位数(68_4_困难_C++)(二分查找)(先合并再挑选中位数;划分数组(二分查找))

LeetCode 热题 100_寻找两个正序数组的中位数&#xff08;68_4&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;先合并再挑选中位数&#xff09;&#xff1a;思路二&#xff08;划分数组&#xff08;二分查找…...

Java多线程与高并发专题——深入ReentrantReadWriteLock

深入ReentrantReadWriteLock 读写锁出现原因 synchronized和ReentrantLock都是互斥锁。如果说有一个操作是读多写少的&#xff0c;还要保证线程安全的话。如果采用上述的两种互斥锁&#xff0c;效率方面很定是很低的。在这种情况下&#xff0c;咱们就可以使用ReentrantReadWr…...

【Python 语法】算法合集

查找二分查找代码大 O 表示法 广度优先搜索代码 狄克斯特拉算法 递归递归调用栈 分而治之&#xff08;divide and conquer&#xff0c;D&C&#xff09;贪心教室调度问题背包问题集合覆盖问题 动态规划背包问题旅游行程最优化 遇到问题时&#xff0c; 如果不确定该如何 高效…...

[STM32]从零开始的STM32 BSRR、BRR、ODR寄存器讲解

一、前言 学习STM32一阵子以后&#xff0c;相信大家对STM32 GPIO的控制也有一定的了解了。之前在STM32 LED的教程中也教了大家如何使用寄存器以及库函数控制STM32的引脚从而点亮一个LED&#xff0c;之前的寄存器只是作为一个引入&#xff0c;并没有深层次的讲解&#xff0c;在教…...

C++ ++++++++++

初始C 注释 变量 常量 关键字 标识符命名规则 数据类型 C规定在创建一个变量或者常量时&#xff0c;必须要指定出相应的数据类型&#xff0c;否则无法给变量分配内存 整型 sizeof关键字 浮点型&#xff08;实型&#xff09; 有效位数保留七位&#xff0c;带小数点。 这个是保…...

C# 牵手DeepSeek:打造本地AI超能力

一、引言 在人工智能飞速发展的当下&#xff0c;大语言模型如 DeepSeek 正掀起新一轮的技术变革浪潮&#xff0c;为自然语言处理领域带来了诸多创新应用。随着数据隐私和安全意识的提升&#xff0c;以及对模型部署灵活性的追求&#xff0c;本地部署 DeepSeek 成为众多开发者和…...

phpstudy安装教程dvwa靶场搭建教程

GitHub - digininja/DVWA: Damn Vulnerable Web Application (DVWA) Dvwa下载地址 Windows版phpstudy下载 - 小皮面板(phpstudy) 小皮下载地址 1选择windows 版本&#xff0c;点击立即下载 下载完成&#xff0c;进行解压&#xff0c;注意不要有中文路径 点击.exe文件进行安装…...

最新版本SpringAI接入DeepSeek大模型,并集成Mybatis

当时集成这个环境依赖冲突&#xff0c;搞了好久&#xff0c;分享一下依赖配置 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instan…...

LLM 算法岗 | 八股问答()· 多模态与主流模型架构

本文能帮你解决什么&#xff1f; 1. 搞懂FastAPI异步&#xff08;async/await&#xff09;到底在什么场景下能真正提升性能。 2. 掌握在FastAPI中正确使用多线程处理CPU密集型任务的方法。 3. 避开常见的坑&#xff08;比如阻塞操作、数据库连接池耗尽、GIL限制&#xff09;。 …...

别再到处找教程了!Linux服务器上保姆级搭建YApi接口管理平台(含Node.js 12.13.0 + MongoDB 7.0.14配置)

企业级YApi私有化部署实战&#xff1a;从零构建高可用接口管理平台 在数字化转型浪潮中&#xff0c;API已成为企业系统互联的核心纽带。根据Postman 2023年度报告&#xff0c;超过82%的中大型企业正在使用专门的API管理工具来提升开发协作效率。YApi作为国产开源API管理平台的佼…...

ESP32-S3 + OV5640摄像头实战:用SD卡模块做个离线拍照盒(附完整代码)

ESP32-S3 OV5640摄像头实战&#xff1a;打造智能离线拍照盒的完整指南 在创客和硬件爱好者的世界里&#xff0c;将高性能硬件与实用功能相结合的项目总是令人兴奋。ESP32-S3搭配OV5640摄像头就是一个绝佳组合&#xff0c;能够实现高质量的图像采集和处理。本文将带你从零开始&…...

Qwen3-ASR-1.7B在软件测试中的语音指令自动化实践

Qwen3-ASR-1.7B在软件测试中的语音指令自动化实践 1. 引言 想象一下这样的场景&#xff1a;测试工程师小王正在执行复杂的软件测试流程&#xff0c;双手忙着操作多个设备&#xff0c;眼睛盯着屏幕上的测试结果&#xff0c;突然需要暂停当前测试、切换到另一个测试用例。传统方…...

Rplidar 报错 RESULT_OPERATION_TIMEOUT 排查指南:从波特率到硬件自检的完整流程

1. 遇到RESULT_OPERATION_TIMEOUT报错时的心态调整 第一次看到Rplidar弹出"Error, operation time out. RESULT_OPERATION_TIMEOUT!"的时候&#xff0c;我也是一头雾水。这种报错就像突然断电的电脑——你不知道是电源线松了还是主板烧了。但根据我处理过上百次这类问…...

前端工程师转型AI Agent开发工程师:小白也能轻松入门的大模型学习路线(建议收藏!)

前端工程师转型AI Agent开发工程师&#xff1a;小白也能轻松入门的大模型学习路线&#xff08;建议收藏&#xff01;&#xff09; 前端工程师转型AI Agent开发具有天然优势&#xff0c;如成熟的Web技术栈、丰富的API调用经验和敏锐的产品交互思维。要转型成功&#xff0c;需补齐…...

Linux实现简易版Shell的代码详解

一、程序流程分析我们日常使用Bash时&#xff0c;通过输入命令执行相应的操作&#xff0c;比如&#xff1a;那么&#xff0c;Bash是如何进行工作的呢&#xff1f;观察一下&#xff0c;就会发现&#xff0c;首先Bash会打印命令行提示符&#xff0c;包括当前用户、主机名以及路径…...

双模型协作方案:OpenClaw同时接入Phi-3-vision-128k-instruct与Qwen的配置技巧

双模型协作方案&#xff1a;OpenClaw同时接入Phi-3-vision-128k-instruct与Qwen的配置技巧 1. 为什么需要双模型协作&#xff1f; 去年我在搭建个人自动化助手时&#xff0c;发现单一模型很难兼顾所有任务场景。当我尝试用纯文本模型处理截图中的表格数据时&#xff0c;识别准…...

周红伟引爆AI“小龙虾”狂潮:80%家长焦虑的职场,正被OpenClaw重塑?

周鸿祎预言&#xff1a;"不用智能体的人&#xff0c;终将被会用智能体的人淘汰。"内容由AI智能生成从极客玩具到企业标配的加速跑OpenClaw的爆火并非偶然。这款开源AI智能体最大的价值在于改变了人们对智能体的认知——它不再是一个只会聊天的工具&#xff0c;而是能…...

这么详细的Wireshark网络抓包和分析教程,你一定要知道!Wireshark网络抓包零基础入门到精通教程建议收藏!

WireShark是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包&#xff0c;并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口&#xff0c;直接与网卡进行数据报文交换。在网络封包和流量分析领域有着十分强大功能的工具&#xff0c;深受各类网络…...