【HarmonyOS Next】数据本地存储:@ohos.data.preferences
【HarmonyOS Next】数据本地存储:@ohos.data.preferences
在开发现代应用程序时,数据存储是一个至关重要的过程。应用程序为了保持某些用户设置、应用状态以及其他小量数据信息通常需要一个可靠的本地存储解决方案。在 HarmonyOS Next 环境下,@ohos.data.preferences
模块为我们提供了一个轻量级且高效的键值对存储方式。本文将深入探讨如何利用该模块进行数据的本地存储,并通过一个实际封装的类举例说明其实现方式。
什么是 @ohos.data.preferences?
@ohos.data.preferences
是 HarmonyOS 提供的轻量级本地存储解决方案,适用于存储简单的键值对。例如保存用户的设置或者应用的配置信息。这一模块提供了一套简便的接口,便于开发者读写数据,持久化存储。
核心功能
- 轻量级存储:非常适用于存储小量和简单的数据。
- 易于使用:通过简单的接口即可实现对数据的增删改查。
- 持久化特性:数据保存在本地存储,应用重启后仍然可以访问。
@ohos.data.preferences 的基本用法
要使用 Preferences 模块进行数据存储,以下是基本步骤:
-
获取 Preferences 实例:
使用dataPreferences.getPreferences(context, 'preferenceName')
方法来获取或创建一个 Preferences 实例。 -
存储数据:
使用putString
,putInt
,putBoolean
等方法来存储数据。最后必须调用flush()
方法,让数据持久化到存储系统中。 -
读取数据:
使用getString
,getInt
,getBoolean
等方法来读取存储在 Preferences 中的数据。 -
删除数据:
用delete(key)
删除具体键的值,用clear()
删除所有数据。
示例代码实现
import preferences from '@ohos.data.preferences';// 获取 Preferences
const context = ...; // 假设 context 可用
const prefName = 'userPreferences';
const preferencesHelper = preferences.getPreferences(context, prefName);// 写入数据
preferencesHelper.putString('theme', 'dark');
preferencesHelper.flush();// 读取数据
const theme = preferencesHelper.getString('theme', 'light');// 删除数据
preferencesHelper.delete('theme');
preferencesHelper.flush();// 清空数据
preferencesHelper.clear();
preferencesHelper.flush();
封装 Preferences 进行简化操作
在更复杂的项目中,直接调用这些方法可能并不够优雅和简洁。为此,我们创建了 PreferencesUtils
类,对 @ohos.data.preferences
进行了一层封装,统一了对数据的操作方法。
PreferencesUtils 类的实现详解
- 类的基本结构
export class PreferencesUtils {private preferencesName: string;private keyPreferences: string;constructor(name: string = PREFERENCES_NAME,keyP: string = KEY_PREFERENCES) {this.preferencesName = name;this.keyPreferences = keyP;}
}
- 成员变量:
preferencesName
和keyPreferences
分别用于存储的文件名和全局引用。 - 构造函数:允许通过参数自定义这两个参数,提高了工具类的灵活性。
- 创建和获取 Preferences 实例
async createPreferences(context: Context): Promise<dataPreferences.Preferences | null> {try {const preferences = await dataPreferences.getPreferences(context, this.preferencesName);GlobalContext.getContext().setObject(this.keyPreferences, preferences);return preferences;} catch (error) {console.error('Error creating preferences:', error);return null;}
}async getPreferences(): Promise<dataPreferences.Preferences | null> {try {return GlobalContext.getContext().getObject(KEY_PREFERENCES);} catch (error) {console.error('Error getting preferences:', error);return null;}
}
- 功能实现:通过
createPreferences
方法创建 Preferences,并保存在全局上下文中;getPreferences
方法用于获取实例,确保在需要时能够顺利地进行数据操作。 - 异常处理:使用
try/catch
结构确保错误被捕获并记录。
-
数据的基本操作
- 获取数据
async get(key: string, def?: ValueType): Promise<ValueType | undefined> {try {const preferences = await this.getPreferences();return preferences ? await preferences.get(key, def) : def;} catch (error) {console.error(`Error getting key ${key}:`, error);return def;} }
- 存储数据
async put(key: string, value: ValueType): Promise<void> {try {const preferences = await this.getPreferences();if (preferences) {await preferences.put(key, value);await preferences.flush();}} catch (error) {console.error(`Error putting key ${key}:`, error);} }
- 删除数据和清空数据
async delete(key: string): Promise<void> {try {const preferences = await this.getPreferences();if (preferences) {await preferences.delete(key);await preferences.flush();}} catch (error) {console.error(`Error deleting key ${key}:`, error);} }async clear(): Promise<void> {try {const preferences = await this.getPreferences();if (preferences) {await preferences.clear();await preferences.flush();}} catch (error) {console.error('Error clearing preferences:', error);} }
- 一致的接口:通过
get
,put
,delete
, 和clear
方法,它简化了对具体存储操作的调用。 - 数据持久化:每次数据操作后调用
flush
确保数据立即写入存储,避免数据丢失。 - 全面的错误管理:在每个方法的实现中均加入了错误捕获和日志记录,以确保运行时出现问题时能够及时反应和处理。
应用示例
下面展示如何在应用中使用 PreferencesUtils
类来管理本地存储的数据:
import PreferencesUtils from './PreferencesUtils';async function initAppPreferences(context: Context) {await PreferencesUtils.createPreferences(context);
}async function updateUserPreferences() {await PreferencesUtils.put('language', 'English');const language = await PreferencesUtils.get('language', 'en');console.log(`Current language preference: ${language}`);
}// 初始化并使用
initAppPreferences(appContext).then(updateUserPreferences);
完整的封装
以下是一个可以直接使用的封装
import GlobalContext from './GlobalContext'
import dataPreferences from '@ohos.data.preferences'const PREFERENCES_NAME = 'yiPreferences'
const KEY_PREFERENCES = "preferences"
type ValueType = number | string | boolean | Array<number> | Array<string> | Array<boolean> | Uint8Array | object | bigintexport class PreferencesUtils{// preferences的文件名private preferencesName: string = PREFERENCES_NAME// 用于获取preferences实例的key值,保存到单例中private keyPreferences: string = KEY_PREFERENCESconstructor(name: string = PREFERENCES_NAME, keyP: string = KEY_PREFERENCES) {this.preferencesName = namethis.keyPreferences = keyP}createPreferences(context: Context): Promise<dataPreferences.Preferences> {let preferences = dataPreferences.getPreferences(context, this.preferencesName)GlobalContext.getContext().setObject(this.keyPreferences, preferences)return preferences}getPreferences(): Promise<dataPreferences.Preferences> {return GlobalContext.getContext().getObject(KEY_PREFERENCES) as Promise<dataPreferences.Preferences>}async get(key: string, def?: ValueType): Promise<ValueType> {return (await this.getPreferences()).get(key, def)}async getAll(): Promise<Object> {let preferences = await this.getPreferences()return preferences.getAll()}async put(key: string, value: ValueType): Promise<void> {let promise = await this.getPreferences().then(async (p) => {await p.put(key, value)await p.flush();}).catch((err: Error)=>{console.log(String(err))})return promise}async delete(key: string): Promise<void> {return (await this.getPreferences()).delete(key).finally(async () => {(await this.getPreferences()).flush()})}async clear(): Promise<void> {return (await this.getPreferences()).clear().finally(async () => {(await this.getPreferences()).flush()})}}export default new PreferencesUtils()
相关文章:

【HarmonyOS Next】数据本地存储:@ohos.data.preferences
【HarmonyOS Next】数据本地存储:ohos.data.preferences 在开发现代应用程序时,数据存储是一个至关重要的过程。应用程序为了保持某些用户设置、应用状态以及其他小量数据信息通常需要一个可靠的本地存储解决方案。在 HarmonyOS Next 环境下,…...
使用BaGet快速搭建nuget服务
BaGet是基于 asp.net core编写的一个轻量级的 nuget管理服务,安装部署非常简单。 * Nuget版本号规范:https://learn.microsoft.com/zh-cn/nuget/concepts/package-versioning。 环境准备 下载 BaGet安装包。 https://loic-sharma.github.io/BaGet/ 下…...

基于Zynq FPGA的雷龙SD NAND存储芯片性能测试
文章目录 前言一、SD NAND特征1.1 SD卡简介1.2 SD卡Block图 二、SD卡样片三、Zynq测试平台搭建3.1 测试流程3.2 SOC搭建 四、软件搭建五、测试结果六、总结 前言 随着嵌入式系统和物联网设备的快速发展,高效可靠的存储解决方案变得越来越重要。雷龙发展推出的SD NA…...

【功能介绍】信创终端系统上各WPS版本的授权差异
原文链接:【功能介绍】信创终端系统上各WPS版本的授权差异 Hello,大家好啊!今天给大家带来一篇关于信创终端操作系统上WPS Office各版本(不包括政务版、企业版等)之间的差异的文章。WPS Office作为国内广泛使用的办公软…...
Neo4j 和 Python 初学者指南:如何使用可选关系匹配优化 Cypher 查询
Neo4j 和 Python 初学者指南:如何使用可选关系匹配优化 Cypher 查询 查询需求分析目标查询结构 编写 Cypher 查询查询解析OPTIONAL MATCH 和 COALESCE 的作用 在 Python 中使用 Neo4j 驱动执行查询使用 neo4j 驱动的 Python 示例代码代码解析示例输出 总结 在使用 N…...

性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台
前言 在当前激烈的市场竞争中,创新和效率成为企业发展的核心要素之一。在这种背景下,如何保证产品和服务的稳定性、可靠性以及高效性就显得尤为重要。 而在软件开发过程中,性能测试是一项不可或缺的环节,它可以有效的评估一个系…...
(vue3)在Pinia Store中正确使用Vue I18n
引言 在Vue 3和Pinia的开发过程中,我们经常需要在store中使用国际化(i18n)功能。然而,这个看似简单的任务可能会导致一些棘手的问题。本文将深入探讨在Pinia store中使用Vue I18n时可能遇到的挑战,解释问题的根源&…...
如何开发查找附近地点的微信小程序
我开发的是找附近卫生间的小程序。 在现代城市生活中,找到一个干净、方便的公共卫生间有时可能是一个挑战。为了解决这个问题,我们可以开发一款微信小程序,帮助用户快速找到附近的卫生间。本文将介绍如何开发这样一款小程序,包…...

三格电子——电梯监测状态项目
方案介绍...
C#-运算符重载
关键词:operator 语法: public static void operator 运算符(参数列表){} 作用:让自定义类或结构体对象,可以使用运算符进行运算 注意: 参数的数量:与所重载的运算符的运算规则有关。如加法只能有2个参数…...

6.qsqlquerymodel源码分析
目录 继承关系入口浅析qsqlquery刷新数据 扩展列或者移除列以及取别名读取数据与增减行读取数据 下一章节:如何使用qsqlquerymodel 与 qtableview实现自定义表格 继承关系 qsqlquerymodel 继承与qabstracttablemodel 入口 负责填充数据 void QSqlQueryModel::s…...

【人工智能】ChatGPT多模型感知态识别
目录 ChatGPT辅助细化知识增强!一、研究背景二、模型结构和代码任务流程一:启发式生成 三、数据集介绍三、性能展示实现过程运行过程训练过程 ChatGPT辅助细化知识增强! 多模态命名实体识别(MNER)最近引起了广泛关注。…...

2.ARM_ARM是什么
CPU工作原理 CPU与内存中的内容: 内存中存放了指令,每一个指令存放的地址不一样,所需的内存空间也不一样。 运算器能够进行算数运算和逻辑运算,这些运算在CPU中都是以运算电路的形式存在,一个运算功能对应一种运算电…...

深入学习指针(5)!!!!!!!!!!!!!!!
文章目录 1.回调函数是什么?2.qsort使用举例2.1使用qsort函数排序整形数据2.2使用sqort排序结构数据 3.qsort函数的模拟实现 1.回调函数是什么? 回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指针(地址)作为参数传递…...
离散无记忆信道
目录 离散无记忆信道输入概率输出概率联合分布概率信道逆向概率一些记号示例1示例2 离散无记忆信道 离散:输入输出字母表都是有限的 无记忆:输出字符 d i d_i di 被接收到的概率只依赖于当前的输入 c i c_i ci, 而与前面的输入无关。 一个离散无记…...

【STM32】项目实战——OV7725/OV2604摄像头颜色识别检测(开源)
本篇文章分享关于如何使用STM32单片机对彩色摄像头(OV7725/OV2604)采集的图像数据进行分析处理,最后实现颜色的识别和检测。 目录 一、什么是颜色识别 1、图像采集识别的一些基本概念 1. 像素(Pixel) 2. 分辨率&am…...

《AI产品经理手册》——解锁AI时代的商业密钥
在当今这个日新月异的AI时代,每一位产品经理都面临着前所未有的挑战与机遇,唯有紧跟时代潮流,深入掌握AI技术的精髓,才能在激烈的市场竞争中独占鳌头。《AI产品经理手册》正是这样一部为AI产品经理量身定制的实战宝典,…...

ArcGIS 地理信息系统 任意文件读取漏洞复现
0x01 产品简介 ArcGIS是由美国Esri公司研发的地理信息系统(GIS)软件,它整合了数据库、软件工程、人工智能、网络技术、云计算等主流的IT技术,旨在为用户提供一套完整的、开放的企业级GIS解决方案,它包含了一套带有用户界面组件的Windows桌面应用。可以实现从简单到复杂的…...
11.07学习
一、三中代码解决鸡兔同笼问题 1.直接解方程 #include <stdio.h> int main() { int heads, feet, chickens, rabbits; printf("请输入总头数:"); scanf("%d", &heads); printf("请输入总脚数:"); scanf(…...
【JavaEE】常见锁策略、CAS
目录 常见的锁策略 乐观锁 vs 悲观锁 重量级锁 vs 轻量级锁 自锁锁和挂起等待锁 读写锁 可重入锁 vs 不可重入锁 公平锁 vs 非公平锁 CAS ABA问题 synchronized几个重要的机制 1、锁升级 2、锁消除 3、锁粗化 常见的锁策略 乐观锁 vs 悲观锁 乐观锁和悲观锁是锁的…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...