HarmonyOS数据持久化:Preferences轻量级存储实战

news/2025/9/24 16:42:28/文章来源:https://www.cnblogs.com/xpzll/p/19109500

本文将详细介绍HarmonyOS 5(API 12)中的用户首选项(Preferences)数据持久化方案,通过实际代码示例讲解如何实现轻量级键值对数据的存储、读取和管理。

1. Preferences核心概念与优势

Preferences是HarmonyOS提供的轻量级键值对数据存储方案,适合保存用户偏好设置、应用配置信息等小规模数据。其核心优势包括操作简单、异步持久化以及支持多种基本数据类型。

1.1 适用场景

  • 用户偏好设置:主题模式、语言选择、通知开关
  • 应用配置信息:首次启动标志、显示选项、排序偏好
  • 轻量级数据缓存:用户ID、会话令牌、临时状态

1.2 特性与限制

  • Key限制:字符串类型,长度≤80字节,非空
  • Value类型:支持string、number、boolean及它们的数组形式
  • 存储容量:建议不超过50MB轻量级数据
  • 线程安全:不支持多进程并发访问

2. 基础API与使用步骤

2.1 模块导入与实例创建

首先导入必要的模块并创建Preferences实例:

import { preferences } from '@kit.ArkData';
import { BusinessError } from '@ohos.base';
import common from '@ohos.app.ability.common';// 获取应用上下文
const context: common.Context = getContext(this) as common.Context;// 创建Preferences实例
let dataPreferences: preferences.Preferences | null = null;async function initPreferences() {try {const options: preferences.Options = {name: 'myAppPreferences' // 首选项文件名};dataPreferences = preferences.getPreferencesSync(context, options);console.info('Preferences实例创建成功');} catch (error) {console.error(`Preferences初始化失败: ${(error as BusinessError).message}`);}
}

2.2 数据写入操作

Preferences支持多种数据类型的存储:

// 写入字符串数据
dataPreferences.putSync('username', '张三');
dataPreferences.putSync('theme', 'dark');// 写入数值数据
dataPreferences.putSync('font_size', 16);
dataPreferences.putSync('login_count', 1);// 写入布尔值数据
dataPreferences.putSync('is_first_launch', true);
dataPreferences.putSync('notification_enabled', false);// 写入数组数据
dataPreferences.putSync('recent_searches', ['华为', '鸿蒙', 'HarmonyOS']);// 立即持久化到磁盘(可选)
dataPreferences.flush((err: BusinessError) => {if (err) {console.error(`数据持久化失败: ${err.message}`);} else {console.info('数据已持久化到磁盘');}
});

2.3 数据读取操作

读取存储的数据值:

// 读取字符串数据(提供默认值)
const username = dataPreferences.getSync('username', '');
const theme = dataPreferences.getSync('theme', 'light');// 读取数值数据
const fontSize = dataPreferences.getSync('font_size', 14);
const loginCount = dataPreferences.getSync('login_count', 0);// 读取布尔值数据
const isFirstLaunch = dataPreferences.getSync('is_first_launch', true);
const notificationsEnabled = dataPreferences.getSync('notification_enabled', true);// 读取数组数据
const recentSearches = dataPreferences.getSync('recent_searches', []);console.info(`用户名: ${username}`);
console.info(`主题模式: ${theme}`);
console.info(`字体大小: ${fontSize}`);

2.4 数据删除与清理

// 删除单个键值对
dataPreferences.deleteSync('is_first_launch');// 检查键是否存在
const hasKey = dataPreferences.hasSync('username');
console.info(`username键存在: ${hasKey}`);// 清空所有数据
dataPreferences.clearSync();// 立即持久化清除操作
dataPreferences.flush((err: BusinessError) => {if (!err) {console.info('所有数据已清除并持久化');}
});

3. 完整实战示例:用户设置管理

下面是一个完整的用户设置管理实现示例:

import { preferences } from '@kit.ArkData';
import { BusinessError } from '@ohos.base';
import common from '@ohos.app.ability.common';@Entry
@Component
struct SettingsManager {private context: common.Context = getContext(this) as common.Context;private settingsPrefs: preferences.Preferences | null = null;@State theme: string = 'light';@State fontSize: number = 14;@State notificationsEnabled: boolean = true;@State isInitialized: boolean = false;// 初始化Preferencesasync aboutToAppear() {await this.initPreferences();await this.loadSettings();this.isInitialized = true;}private async initPreferences() {try {const options: preferences.Options = {name: 'user_settings'};this.settingsPrefs = preferences.getPreferencesSync(this.context, options);console.info('用户设置Preferences初始化成功');} catch (error) {console.error(`初始化失败: ${(error as BusinessError).message}`);}}// 加载用户设置private async loadSettings() {if (!this.settingsPrefs) return;this.theme = this.settingsPrefs.getSync('theme', 'light') as string;this.fontSize = this.settingsPrefs.getSync('font_size', 14) as number;this.notificationsEnabled = this.settingsPrefs.getSync('notifications_enabled', true) as boolean;}// 保存单一设置private async saveSetting(key: string, value: preferences.ValueType) {if (!this.settingsPrefs) return;try {this.settingsPrefs.putSync(key, value);await this.flushPreferences();console.info(`设置 ${key} 已保存`);} catch (error) {console.error(`保存设置失败: ${(error as BusinessError).message}`);}}// 持久化到磁盘private async flushPreferences(): Promise<void> {return new Promise((resolve, reject) => {if (!this.settingsPrefs) {reject('Preferences实例未初始化');return;}this.settingsPrefs.flush((err: BusinessError) => {if (err) {reject(err.message);} else {resolve();}});});}// 主题切换private async toggleTheme() {const newTheme = this.theme === 'light' ? 'dark' : 'light';this.theme = newTheme;await this.saveSetting('theme', newTheme);}// 字体大小调整private async adjustFontSize(increase: boolean) {const newSize = increase ? this.fontSize + 2 : this.fontSize - 2;this.fontSize = Math.max(12, Math.min(24, newSize)); // 限制范围12-24await this.saveSetting('font_size', this.fontSize);}// 通知开关切换private async toggleNotifications() {this.notificationsEnabled = !this.notificationsEnabled;await this.saveSetting('notifications_enabled', this.notificationsEnabled);}build() {Column({ space: 20 }) {Text('应用设置').fontSize(24).fontWeight(FontWeight.Bold).margin({ top: 20, bottom: 30 })// 主题设置Row() {Text('主题模式:').fontSize(18).layoutWeight(1)Text(this.theme === 'light' ? '浅色' : '深色').fontSize(16).fontColor(this.theme === 'light' ? '#000000' : '#FFFFFF')Button('切换').onClick(() => this.toggleTheme()).margin({ left: 10 })}.width('90%').padding(10).backgroundColor(this.theme === 'light' ? '#F5F5F5' : '#333333')// 字体大小设置Row() {Text('字体大小:').fontSize(18).layoutWeight(1)Text(this.fontSize.toString()).fontSize(16)Button('减小').onClick(() => this.adjustFontSize(false)).margin({ left: 10 })Button('增大').onClick(() => this.adjustFontSize(true)).margin({ left: 5 })}.width('90%').padding(10).backgroundColor(this.theme === 'light' ? '#F5F5F5' : '#333333')// 通知设置Row() {Text('消息通知:').fontSize(18).layoutWeight(1)Text(this.notificationsEnabled ? '开启' : '关闭').fontSize(16)Button('切换').onClick(() => this.toggleNotifications()).margin({ left: 10 })}.width('90%').padding(10).backgroundColor(this.theme === 'light' ? '#F5F5F5' : '#333333')// 状态显示if (this.isInitialized) {Text('设置已保存到本地存储').fontSize(14).fontColor(Color.Gray).margin({ top: 20 })}}.width('100%').height('100%').backgroundColor(this.theme === 'light' ? '#FFFFFF' : '#000000')}
}

4. 高级特性与最佳实践

4.1 数据变更订阅

Preferences支持数据变更通知,可用于实现设置同步:

// 订阅数据变更
private setupPreferenceListeners() {if (!this.settingsPrefs) return;const observer = (key: string) => {console.info(`设置项 ${key} 已变更`);this.loadSettings(); // 重新加载设置};// 添加变更监听this.settingsPrefs.on('change', observer);// 在组件销毁时移除监听this.settingsPrefs.off('change', observer);
}

4.2 错误处理与健壮性设计

class SafePreferences {private prefs: preferences.Preferences | null = null;// 安全写入数据async safePut(key: string, value: preferences.ValueType): Promise<boolean> {try {if (!this.prefs) {throw new Error('Preferences实例未初始化');}this.prefs.putSync(key, value);await this.safeFlush();return true;} catch (error) {console.error(`数据写入失败: ${error.message}`);return false;}}// 安全读取数据safeGet<T extends preferences.ValueType>(key: string, defaultValue: T): T {try {if (!this.prefs) {throw new Error('Preferences实例未初始化');}return this.prefs.getSync(key, defaultValue) as T;} catch (error) {console.error(`数据读取失败: ${error.message}`);return defaultValue;}}// 安全持久化private async safeFlush(): Promise<boolean> {return new Promise((resolve) => {if (!this.prefs) {resolve(false);return;}this.prefs.flush((err: BusinessError) => {if (err) {console.error(`持久化失败: ${err.message}`);resolve(false);} else {resolve(true);}});});}
}

4.3 数据迁移与兼容性

// 处理数据迁移
async migrateOldSettings() {const oldPrefs = preferences.getPreferencesSync(this.context, { name: 'old_settings' });const newPrefs = preferences.getPreferencesSync(this.context, { name: 'new_settings' });// 迁移数据const keys = ['theme', 'font_size', 'notifications_enabled'];for (const key of keys) {if (oldPrefs.hasSync(key)) {const value = oldPrefs.getSync(key, '');newPrefs.putSync(key, value);}}await newPrefs.flush();console.info('数据迁移完成');
}

5. 性能优化建议

  1. 批量操作:尽量减少flush调用次数,多个操作后统一flush
  2. 内存管理:及时清理不再使用的Preferences实例
  3. 数据量控制:单个Preferences文件存储数据不宜超过50MB
  4. 类型安全:使用TypeScript类型约束确保数据一致性
// 批量操作示例
async function saveMultipleSettings(settings: Record<string, preferences.ValueType>) {for (const [key, value] of Object.entries(settings)) {dataPreferences.putSync(key, value);}// 批量操作后统一持久化await dataPreferences.flush((err: BusinessError) => {if (!err) {console.info('批量设置保存成功');}});
}

6. 总结

Preferences是HarmonyOS中简单易用的轻量级数据持久化方案,非常适合存储用户设置和应用配置信息。通过本文的介绍,您应该掌握:

  1. 基本操作:Preferences实例的创建、数据读写和删除
  2. 实战应用:实现完整的用户设置管理界面
  3. 高级特性:数据变更订阅、错误处理和迁移策略
  4. 性能优化:批量操作和内存管理最佳实践

Preferences虽然简单,但在实际开发中非常实用,合理使用可以显著提升应用的用户体验和稳定性。

关键注意事项

  • 避免存储敏感信息,Preferences不支持加密存储
  • 不适合存储大量数据或复杂关系型数据
  • 多进程环境下需要额外的同步机制

对于需要存储大量结构化数据或敏感信息的场景,建议考虑使用关系型数据库(RelationalStore)或其他安全存储方案。

需要参加鸿蒙认证的请点击 鸿蒙认证链接

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

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

相关文章

HarmonyOS服务卡片开发:动态卡片与数据绑定实战指南

✨ 一、服务卡片概述与优势 服务卡片是HarmonyOS提供的一种轻量级UI组件,具有以下核心特性:信息前置:将应用关键信息直接展示在桌面、锁屏等位置,用户无需打开应用即可获取重要信息。 交互便捷:支持按钮点击等基础…

【CV】GAN代码解析:base_model.py

【CV】GAN代码解析:base_model.pyPosted on 2025-09-24 16:39 SaTsuki26681534 阅读(0) 评论(0) 收藏 举报import os # 标准库:操作系统相关(本文件中未直接使用) import torch # PyTorch 主库 from pathli…

有理数类的问题回答

1. 与C语言有理数代码相比,该Java类更面向对象的原因 (1)封装性:Java类将有理数的分子numerator和分母denominator设为private,仅通过public方法对外暴露功能,隐藏了内部实现细节;而C语言通常通过结构体直接暴露…

企业网站设计与实现论文移动网站系统

听说这是目录哦 FinalShell连接VMware&#x1f324;️解决重连失效FinalShell的使用 免密登录⛈️能量站&#x1f61a; FinalShell连接VMware&#x1f324;️ 保持虚拟机的开机状态&#xff0c;打开FinalShell&#xff0c;如果虚拟机关机或者挂起&#xff0c;连接就会断开。 …

做网站时图片要切片有什么作用可以做砍价链接的网站

车牌识别系统 YOLOv5和LPRNet的车牌识别系统结合了深度学习技术的先进车牌识别解决方案。该系统整合了YOLOv5目标检测框架和LPRNet文本识别模型 1. YOLOv5目标检测框架 YOLO是一种先进的目标检测算法&#xff0c;以其实时性能和高精度闻名。YOLOv5是在前几代基础上进行优化的…

南昌网站建设规划方案传媒公司网站源码php

引人入胜的开篇&#xff1a;想要搞清楚LSTM中的每个公式的每个细节为什么是这样子设计吗&#xff1f;想知道simple RNN是如何一步步的走向了LSTM吗&#xff1f;觉得LSTM的工作机制看不透&#xff1f;恭喜你打开了正确的文章&#xff01; 前方核弹级高能预警&#xff01;本文信息…

微信版网站开发用安卓做网站

幸福树&#xff0c;一种寓意美好的观赏型植物&#xff0c;它生长非常迅速&#xff0c;稍不注意就长的非常茂盛。而要想保证幸福树的美貌&#xff0c;跟人的头发一样&#xff0c;我们要给它适当的修剪&#xff0c;那幸福树怎么修剪呢&#xff1f;为了大家能养出美丽的幸福树来&a…

HarmonyOS后台任务调度:JobScheduler与WorkManager实战指南

本文将深入探讨HarmonyOS 5(API 12)中的后台任务调度机制,重点讲解JobScheduler和WorkManager的使用方法、适用场景及最佳实践,帮助开发者实现高效、智能的后台任务管理。1. 后台任务调度概述 HarmonyOS提供了两种…

总线传输的四个阶段

1.申请分配阶段 由需要使用总线的主模块或主设备提出申请,经过总线仲裁机构决定下一个传输周期的总线使用权。也可将此阶段细分为传输请求和总线仲裁两个阶段 2.寻址阶段 获得使用权的主模块,通过总线发出本次要访问…

学校站群框架如何开发插件实现Word图片的批量上传与编辑?

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

化妆品公司网站源码wordpress ip锁定插件

在React的类组件中&#xff0c;从组件创建到组件被挂载到页面中&#xff0c;这个过程react存在一系列的生命周期函数&#xff0c;最主要的生命周期函数是componentDidMount、componentDidUpdate、componentWillUnmount 生命周期图例如下 1. componentDidMount组件挂载 如果你…

怎样改网站英文域名保定定兴网站建设

来源&#xff1a;新战略机器人为什么需要协作机器人&#xff1f;协作机器人的兴起意味着传统机器人必然有某种程度的不足&#xff0c;或者无法适应新的市场需求。总结一下&#xff0c;主要有几点&#xff1a;传统机器人部署成本高其实相对来讲&#xff0c;工业机器人本身的价格…

广西工程造价信息网佛山seo优化排名推广

1、先登录服务器创建新目录aaa 2、云盘都快照备份下。后续操作完核实无误了&#xff0c;您根据您需求删除快照就行&#xff0c; 然后登录服务器内执行&#xff1a; fdisk -l sblk blkid ll /aaa 3、执行&#xff1a;&#xff08;以下命令是进行数据盘做ext4文件系统并挂载…

HarmonyOS事件订阅与通知:后台事件处理

本文将深入探讨HarmonyOS 5(API 12)中的事件订阅与通知机制,重点讲解如何在后台处理事件,实现应用的实时响应和跨设备协同。内容涵盖核心API、实现步骤、实战示例及性能优化建议。1. 事件订阅与通知机制概述 Harmo…

HarmonyOS后台任务管理:短时与长时任务实战指南

本文将深入探讨HarmonyOS 5(API 12)中的后台任务管理机制,详细讲解短时任务和长时任务的适用场景、实现方法、性能优化及最佳实践,帮助开发者构建高效节能的后台任务系统。1. 后台任务概述与分类 HarmonyOS提供了完…

案例分享 | 芯片企业官网优化

案例分享 | 芯片企业官网优化

Kali Linux 2025.3 发布 (Vagrant Nexmon) - 领先的渗透测试发行版

Kali Linux 2025.3 发布 (Vagrant & Nexmon) - 领先的渗透测试发行版Kali Linux 2025.3 发布 (Vagrant & Nexmon) - 领先的渗透测试发行版 The most advanced Penetration Testing Distribution 请访问原文链接…

C语言多线程同步详解:从互斥锁到条件变量

在多线程编程中,线程同步是确保多个线程正确协作的关键技术。当多个线程访问共享资源时,如果没有适当的同步机制,可能会导致数据竞争、死锁等问题。本文将详细介绍C语言中常用的线程同步技术。 为什么需要线程同步?…

收废铁的做网站有优点吗完整网站设计

一、卸载 1. sudo apt-get autoclean 如果你的硬盘空间不大的话&#xff0c;可以定期运行这个程序&#xff0c;将已经删除了的软件包的.deb安装文件从硬盘中删除掉。如果你仍然需要硬盘空间的话&#xff0c;可以试试apt-get clean&#xff0c;这会把你已安装的软件包的安装包也…

微网站的好处服务器架设国外做违法网站

文章目录 给飞行中的飞机换引擎安全意识十原则开发层面产品层面运维层面给飞行中的飞机换引擎 所谓给飞行中的飞机(或飞驰的汽车)换引擎,说的是我们需要对一个正在飞速发展的系统进行大幅度的架构改造,比如把 All-in-one 的架构改造成微服务架构,尽可能减少或者消除停服的…