鸿蒙用户首选项数据持久化

news/2025/3/13 20:39:56/文章来源:https://www.cnblogs.com/zhaloe/p/18769665

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

动作机制

如图所示,用户程序通过ArkTS接口调用用户首选项读写对应的数据文件。开发者可以将用户首选项持久化文件的内容加载到Preferences实例,每个文件唯一对应到一个Preferences实例,系统会通过静态容器将该实例存储在内存中,直到主动从内存中移除该实例或者删除该文件。

约束限制

  • 首选项无法保证进程并发安全,会有文件损坏和数据丢失的风险,不支持在多进程场景下使用。
  • Key键为string类型,要求非空且长度不超过1024个字节。
  • 如果Value值为string类型,请使用UTF-8编码格式,可以为空,不为空时长度不超过16MB。
  • 当存储的数据中包含非UTF-8格式的字符串时,请使用Uint8Array类型存储,否则会造成持久化文件出现格式错误造成文件损坏。
  • 当调用removePreferencesFromCache或者deletePreferences后,订阅的数据变更会主动取消订阅,重新getPreferences后需要重新订阅数据变更。
  • 不允许deletePreferences与其他接口多线程、多进程并发调用,否则会发生不可预期行为。
  • 内存会随着存储数据量的增大而增大,所以存储的数据量应该是轻量级的,建议存储的数据不超过50MB,当存储的数据较大时,在使用同步接口创建Preferences对象和持久化数据时会变成耗时操作,不建议在主线程中使用,否则可能出现appfreeze问题。

开发步骤

  1. 导入@kit.ArkData模块
import { preferences } from '@kit.ArkData';
  1. 获取Preferences实例
import { UIAbility } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { window } from '@kit.ArkUI';let dataPreferences: preferences.Preferences | null = null;class EntryAbility extends UIAbility {onWindowStageCreate(windowStage: window.WindowStage) {let options: preferences.Options = { name: 'myStore' };dataPreferences = preferences.getPreferencesSync(this.context, options);}
}
  1. 写入数据

使用putSync()方法保存数据到缓存的Preferences实例中。在写入数据后,如有需要,可使用flush()方法将Preferences实例的数据存储到持久化文件。

import { util } from '@kit.ArkTS';
if (dataPreferences.hasSync('startup')) {console.info("The key 'startup' is contained.");
} else {console.info("The key 'startup' does not contain.");// 此处以此键值对不存在时写入数据为例dataPreferences.putSync('startup', 'auto');// 当字符串有特殊字符时,需要将字符串转为Uint8Array类型再存储let uInt8Array1 = new util.TextEncoder().encodeInto("~!@#¥%……&*()——+?");dataPreferences.putSync('uInt8', uInt8Array1);
}
  1. 读取数据

使用getSync()方法获取数据,即指定键对应的值。如果值为null或者非默认值类型,则返回默认数据。

let val = dataPreferences.getSync('startup', 'default');
console.info("The 'startup' value is " + val);
// 当获取的值为带有特殊字符的字符串时,需要将获取到的Uint8Array转换为字符串
let uInt8Array2 : preferences.ValueType = dataPreferences.getSync('uInt8', new Uint8Array(0));
let textDecoder = util.TextDecoder.create('utf-8');
val = textDecoder.decodeToString(uInt8Array2 as Uint8Array);
console.info("The 'uInt8' value is " + val);
  1. 删除数据

使用deleteSync()方法删除指定键值对。

dataPreferences.deleteSync('startup');
  1. 数据持久化

应用存入数据到Preferences实例后,可以使用flush()方法实现数据持久化。

dataPreferences.flush((err: BusinessError) => {if (err) {console.error(`Failed to flush. Code:${err.code}, message:${err.message}`);return;}console.info('Succeeded in flushing.');
})
  1. 删除指定文件

使用deletePreferences()方法从内存中移除指定文件对应的Preferences实例,包括内存中的数据。若该Preference存在对应的持久化文件,则同时删除该持久化文件,包括指定文件及其备份文件、损坏文件。

preferences.deletePreferences(this.context, options, (err: BusinessError) => {if (err) {console.error(`Failed to delete preferences. Code:${err.code}, message:${err.message}`);return;}console.info('Succeeded in deleting preferences.');
})

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

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

相关文章

基于 .NET Blazor 开源、低代码、易扩展的插件开发框架

前言 今天大姚给大家分享一个基于 .NET Blazor 开源的轻量级、跨平台、低代码、易扩展的插件开发框架:Known。 项目介绍 Known 是一个基于 Blazor 的轻量级、跨平台、低代码、易扩展的插件开发框架。它旨在帮助开发者快速构建和扩展应用程序,提供了一整套工具和组件,从前端到…

unity Terrain绘制树时提示所选树没有LOD组解决方法

个人理解LOD组是一种unity优化资源显示的方法,为了节省资源, 如果刷绘的预制件没有LOD组,刷多了无论远近都是显示状态,就很卡解决方法:给需要绘制的树预制件添加LOD组 组件 根据不同阶段放入不同显示的模型或者网格,预制件添加后记得保存应用,这样就可以在Terrain绘制树了 时间…

什么是自然语言的概率分布

自然语言的概率分布,是指在自然语言处理(NLP)中,对语言单位(如单词、短语、句子等)出现的概率进行建模和描述的方式。 它反映了语言使用的统计规律,即某些语言单位比其他单位更常出现。 核心思想: 自然语言并非随机的字符组合,而是遵循一定的统计规律。有些单词、短语…

GESP-Lv8总结(202409)

GESP C++ 八级 2024 年 09 月 题目链接 错题 ( T1 ) 下面关于C++类和对象的说法,错误的是 A. 类的析构函数可以为虚函数 B. 类的构造函数不可以为虚函数 C. class中成员的默认访问权限为private D. struct中成员的默认访问权限为private \(\color{red}{根本不会:)}\) 这道题有…

20242934 2024-2025-2 《网络攻防实践》第3周作业

1.实验内容 实验一:网络嗅探:网络嗅探利用计算机网络接口截获其他计算机数据报文,以监听数据流中包含的有效信息。由于捕获到的数据报文是经过封包处理的二进制数据,故还要结合网络协议分析技术。 使用tcpdump开源软件对在本机上访问www.tianya.cn网站过程进行嗅探,回答问…

github 2FA 双因素验证

- 参考连接:https://www.cnblogs.com/johnnyzen/p/17880870.html 我采用浏览器插件 在谷歌商店搜索: Authenticator: 2FA Clien 2、选择添加到扩展程序3,点击这个插件,记得使用免费的 切换到github的双重验证二维码界面 点击抓取二维码 然后就会出来验证码,输入即可-

GESP-Lv8总结(202406)

GESP C++ 八级 2024 年 06 月 题目链接 错题 ( T4 ) 有V个顶点、E条边的图的深度优先搜索遍历时间复杂度为 \(\color{red}{错误的:O(V})\) \(\color{green}正确的:O(V+E)\) 求时间复杂度,我们就需要先搞清楚源代码是什么?以下为 DFS 模板 void dfs(int now, int fa) {for(int…

城市林业的无声革命:人工智能与古老生态学如何重新设计城市

城市林业的无声革命:人工智能与古老生态学如何重新设计城市 在摩天大楼的阴影下,一场静悄悄的变革正在发生——它融合了硅芯片与古老根系,算法与原住民智慧。 作者:保罗桑杜作者利用 PicLumen 创建的图像城市森林不再只是城市规划中的装饰性附带元素。它们已成为活生生的实…

Andriod连接

1.创建项目:2.配置: AndroidManifest.xml添加语句点击查看代码<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />android:usesCleartextTraffic…

虚拟试衣间

虚拟试衣间 一、团队介绍 1.1 团队概况 1.1.1 博客展示链接 团队名,组长博客链接https://www.cnblogs.com/c-eng/p/18763232 1.1.2 团队项目描述 虚拟试衣间 1.1.3 队员风采 姓名:曾成鑫 风格:Excellent Nimble Talented Perfect 擅长的技术:Python 编程的兴趣:c++ 希望的…

AI Agent替代化成风,企业HR SaaS如何选?| 盘点2025国内HR SaaS厂商Top10

自2025年以来,前有DeepSeek搅动国内外AI圈,后又国内外各大厂商纷纷加速AI技术及产品应用落地,紧随而来,在AI Agent成为又一关键热词,Manus携“全球首款通用Agent产品”再次掀起一番躁动。 如此喧嚣热闹的背景之下,向广大人力资源从业者传递一个强烈信号:AI技术的发展正在…

python的基本运用(3)——索引、切片、字符串

一、索引 索引在公司中一般也叫下标,或角标定义:可我们可以直接使用索引来访问序列中的元素,同时索引可分为正向索引和负向索引两种,而切片也会用到索引,如下图:Python中有序列:字符,列表,元组无序:集合正向索引:从0开始负向索引:-1开始二、切片 定义:切片是指对操…