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

【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 模块进行数据存储,以下是基本步骤:

  1. 获取 Preferences 实例
    使用 dataPreferences.getPreferences(context, 'preferenceName') 方法来获取或创建一个 Preferences 实例。

  2. 存储数据
    使用 putString, putInt, putBoolean 等方法来存储数据。最后必须调用 flush() 方法,让数据持久化到存储系统中。

  3. 读取数据
    使用 getString, getInt, getBoolean 等方法来读取存储在 Preferences 中的数据。

  4. 删除数据
    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 类的实现详解

  1. 类的基本结构
export class PreferencesUtils {private preferencesName: string;private keyPreferences: string;constructor(name: string = PREFERENCES_NAME,keyP: string = KEY_PREFERENCES) {this.preferencesName = name;this.keyPreferences = keyP;}
}
  • 成员变量preferencesNamekeyPreferences 分别用于存储的文件名和全局引用。
  • 构造函数:允许通过参数自定义这两个参数,提高了工具类的灵活性。
  1. 创建和获取 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 结构确保错误被捕获并记录。
  1. 数据的基本操作

    • 获取数据
    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】数据本地存储&#xff1a;ohos.data.preferences 在开发现代应用程序时&#xff0c;数据存储是一个至关重要的过程。应用程序为了保持某些用户设置、应用状态以及其他小量数据信息通常需要一个可靠的本地存储解决方案。在 HarmonyOS Next 环境下&#xff0c…...

使用BaGet快速搭建nuget服务

BaGet是基于 asp.net core编写的一个轻量级的 nuget管理服务&#xff0c;安装部署非常简单。 * Nuget版本号规范&#xff1a;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搭建 四、软件搭建五、测试结果六、总结 前言 随着嵌入式系统和物联网设备的快速发展&#xff0c;高效可靠的存储解决方案变得越来越重要。雷龙发展推出的SD NA…...

【功能介绍】信创终端系统上各WPS版本的授权差异

原文链接&#xff1a;【功能介绍】信创终端系统上各WPS版本的授权差异 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于信创终端操作系统上WPS Office各版本&#xff08;不包括政务版、企业版等&#xff09;之间的差异的文章。WPS Office作为国内广泛使用的办公软…...

Neo4j 和 Python 初学者指南:如何使用可选关系匹配优化 Cypher 查询

Neo4j 和 Python 初学者指南&#xff1a;如何使用可选关系匹配优化 Cypher 查询 查询需求分析目标查询结构 编写 Cypher 查询查询解析OPTIONAL MATCH 和 COALESCE 的作用 在 Python 中使用 Neo4j 驱动执行查询使用 neo4j 驱动的 Python 示例代码代码解析示例输出 总结 在使用 N…...

性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台

前言 在当前激烈的市场竞争中&#xff0c;创新和效率成为企业发展的核心要素之一。在这种背景下&#xff0c;如何保证产品和服务的稳定性、可靠性以及高效性就显得尤为重要。 而在软件开发过程中&#xff0c;性能测试是一项不可或缺的环节&#xff0c;它可以有效的评估一个系…...

(vue3)在Pinia Store中正确使用Vue I18n

引言 在Vue 3和Pinia的开发过程中&#xff0c;我们经常需要在store中使用国际化&#xff08;i18n&#xff09;功能。然而&#xff0c;这个看似简单的任务可能会导致一些棘手的问题。本文将深入探讨在Pinia store中使用Vue I18n时可能遇到的挑战&#xff0c;解释问题的根源&…...

如何开发查找附近地点的微信小程序

我开发的是找附近卫生间的小程序。 在现代城市生活中&#xff0c;找到一个干净、方便的公共卫生间有时可能是一个挑战。为了解决这个问题&#xff0c;我们可以开发一款微信小程序&#xff0c;帮助用户快速找到附近的卫生间。本文将介绍如何开发这样一款小程序&#xff0c;包…...

三格电子——电梯监测状态项目

方案介绍...

C#-运算符重载

关键词&#xff1a;operator 语法&#xff1a; public static void operator 运算符(参数列表){} 作用&#xff1a;让自定义类或结构体对象&#xff0c;可以使用运算符进行运算 注意&#xff1a; 参数的数量&#xff1a;与所重载的运算符的运算规则有关。如加法只能有2个参数…...

6.qsqlquerymodel源码分析

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

【人工智能】ChatGPT多模型感知态识别

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

2.ARM_ARM是什么

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

深入学习指针(5)!!!!!!!!!!!!!!!

文章目录 1.回调函数是什么&#xff1f;2.qsort使用举例2.1使用qsort函数排序整形数据2.2使用sqort排序结构数据 3.qsort函数的模拟实现 1.回调函数是什么&#xff1f; 回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递…...

离散无记忆信道

目录 离散无记忆信道输入概率输出概率联合分布概率信道逆向概率一些记号示例1示例2 离散无记忆信道 离散&#xff1a;输入输出字母表都是有限的 无记忆&#xff1a;输出字符 d i d_i di​ 被接收到的概率只依赖于当前的输入 c i c_i ci​, 而与前面的输入无关。 一个离散无记…...

【STM32】项目实战——OV7725/OV2604摄像头颜色识别检测(开源)

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

《AI产品经理手册》——解锁AI时代的商业密钥

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

ArcGIS 地理信息系统 任意文件读取漏洞复现

0x01 产品简介 ArcGIS是由美国Esri公司研发的地理信息系统(GIS)软件,它整合了数据库、软件工程、人工智能、网络技术、云计算等主流的IT技术,旨在为用户提供一套完整的、开放的企业级GIS解决方案,它包含了一套带有用户界面组件的Windows桌面应用。可以实现从简单到复杂的…...

11.07学习

一、三中代码解决鸡兔同笼问题 1.直接解方程 #include <stdio.h> int main() { int heads, feet, chickens, rabbits; printf("请输入总头数&#xff1a;"); scanf("%d", &heads); printf("请输入总脚数&#xff1a;"); scanf(…...

【JavaEE】常见锁策略、CAS

目录 常见的锁策略 乐观锁 vs 悲观锁 重量级锁 vs 轻量级锁 自锁锁和挂起等待锁 读写锁 可重入锁 vs 不可重入锁 公平锁 vs 非公平锁 CAS ABA问题 synchronized几个重要的机制 1、锁升级 2、锁消除 3、锁粗化 常见的锁策略 乐观锁 vs 悲观锁 乐观锁和悲观锁是锁的…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...