HarmonyOS应用数据持久化:Preferences用户首选项全攻略(实战场景 + 封装 + 面试对比)

在鸿蒙应用开发中,数据持久化是核心需求之一 —— 无论是用户配置、业务数据还是登录状态,都需要通过合适的方式保存到设备中,避免应用重启后数据丢失。而用户首选项(Preferences) 作为最常用、最轻量化的持久化方案,是每个鸿蒙开发者必须掌握的技能。本文将以 Preferences 为核心,详解其用法、实战封装,并对比其他持久化方案,帮你彻底搞定轻量数据存储难题。​

一、鸿蒙 3 种数据持久化方案速览(聚焦 Preferences 定位)​

鸿蒙提供 3 种主流持久化方式,其中 Preferences 主打 “轻量、快速、易用”,先通过表格明确其定位:

持久化方案​
核心特性​
适用场景​
数据规模限制​
用户首选项(Preferences)(核心)​
键值对存储、全量加载到内存、访问速度快​
应用配置(字体大小、夜间模式)、用户偏好​
单条数据≤16MB,总数据≤50MB,建议≤1 万条​
键值型数据库(KV-Store)​
非关系型、分布式友好、跨设备兼容​
无复杂关系的业务数据(如收藏列表)​
无明确上限,适合中少量数据​
关系型数据库(RelationalStore)​
支持 SQL、行列表存储、事务处理​
复杂关系数据(如订单、用户 - 商品关联)​
适合大量结构化数据​
核心选型原则:​

简单配置 / 小数据 → 优先用户首选项(Preferences)​
无关系业务数据 / 跨设备场景 → KV-Store​
复杂关联数据 / 需 SQL 查询 → 关系型数据库
二、用户首选项(Preferences)核心详解​

作为鸿蒙轻量数据持久化的首选,Preferences 以文本形式存储键值对,应用启动时全量加载到内存,读写效率极高,但不适合存储大量数据(内存占用会随数据量增长而增大)。​

❶ 适用场景快速判断​

适用存储场景(如下图中 1、2、3、5、6、10、11) 针对于小白开发者来说可以推敲下为什么这些场景要用Preferences来存储而不是api接口直接获取展示🤔。

基础较为薄弱的小伙伴也可以私信 有问必答🍃

快速判断标准:​

单条数据(原始类型 / 单个对象)→ 直接用 Preferences​
多条对象 / 复杂结构数据 → 切换关系型数据库
❷ 核心依赖:上下文(context)​

操作 Preferences 必须先获取context(上下文环境),其核心作用:​

提供应用唯一标识、临时目录等关键信息​
支持应用生命周期相关操作(如协议页不同意则退出应用)
上述是伪代码,主要让大家理解下context场景 (ps. context是鸿蒙非常重要的一个知识点 这里简单概括  不是很清楚也可以ai以下)

❸ 基础开发 3 步走(快速上手)​

  1. 导入核心模块​

  2. 获取 Preferences 实例​

通过上下文创建实例,name为存储到磁盘的文件名:​

  1. 核心 API 使用(存 / 读 / 删)​

操作​
API 语法​
说明​
存储​
putSync(键, 值) + flush()​
putSync写入内存,flush()同步到磁盘(实现持久化)​
读取​
getSync(键, 默认值)​
从内存中读取,应用重启后会从磁盘加载到内存​
删除​
deleteSync(键)​
从内存中删除,需配合flush()同步到磁盘​
​⚠️ 关键提醒(3 遍强调):​

Preferences 数据持久化功能必须在模拟器或真机上运行,预览模式无法生效!​

Preferences 数据持久化功能必须在模拟器或真机上运行,预览模式无法生效!​

Preferences 数据持久化功能必须在模拟器或真机上运行,预览模式无法生效!​

磁盘文件路径:/data/app/el2/100/base/应用唯一标识/haps/entry/preferences/文件名(可通过 Device File Browser 查看)​

❹ 基础使用示例(入门学习用)​

  1. 初始化 Preferences(entryability 中)​应用启动时初始化,避免重复创建实例:​

  2. 页面中读写数据​

❺ 实战封装:PreferencesUtil 工具类(企业级用法)​

入门示例仅用于学习,实战中需封装工具类,统一管理 Preferences 实例、避免重复代码。​

a. 封装步骤分析​

定义工具类(大驼峰命名,后缀 Util)​
封装核心方法(初始化、存、读、同步磁盘)​
处理实例唯一性(避免重复创建)​
导出单例对象(小驼峰命名,方便导入)​
b. 工具类代码(utils/PreferencesUtil.ets)

工作推荐api改成异步 这里为了减少代码用的同步

c. 实战使用步骤​

(1)初始化工具类(entryability 中)

(2)页面中使用

三、企业级面试题:HarmonyOS应用数据持久化周边

数据持久化用过哪些? 🐝🐝

首选项如何实现持久化 🐝🐝

首选项和PersistentStorage区别

PersistentStorage进行数据持久化,和preferences用户首选项使用场景?

非UI页面使用用户首选项时context如何获取

可以在UIAbility里通过AppStorage或LocalStorage里存储context,然后在非ArkUI页面里使用。

this.context

getContext(this)

通过用户首选项实现数据持久化之后,如果App更新版本,之前首选项的数据是否会保留

持久化之后的数据是存在文件中的,App更新版本之后是存在的。

关系型数据库(RelationalStore)如何实现

键值型数据接口(KV-Store)如何实现

跨模块、跨进程时如何保证正常读取首选项中数据?

跨模块:

由于context不同,获取到的是不同的首选项实例,因此会导致在跨模块、多页面等场景下取不到数据。此时可以考虑通过单例类在EntryAbility中存一个全局的context,或者使用应用级context。

跨进程:

不同进程一般只有在同沙箱的场景才能访问到一个preference文件,多进程可以通过dataGroupId在多个进程间共用一个preference文件。

首选项存储如果多个任务同时写入、并发的情况能保证数据的准确性吗

首选项无法保证进程并发安全,会有文件损坏和数据丢失的风险,不支持在多进程场景下使用。

对于多线程操作首选项和数据库是不是线程安全的?还是每一个线程独立的

是线程安全的。

用户首选项是线程安全的吗

首选项是线程安全的,所以多线程访问可以保证数据一致性,但只支持同进程,不支持多进程。

不依赖接口 用手机存储 怎么存储

自己通过文件管理直接写数据然后获取出来

鸿蒙开发者班级

posted @ 2025-11-27 12:50  神龙教主  阅读(5)  评论(0)    收藏  举报