HarmonyOS本地存储-Preferences(用户首选项)的使用

一,用户首选项简述

@ohos.data.preferences (用户首选项)

用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。

数据存储形式为键值对,键的类型为字符串型,值的存储数据类型包括数字型、字符型、布尔型以及这3种类型的数组类型。

说明:

本模块首批接口从API version 9开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。

具体详情查看官网,地址:

文档中心

二,常用接口介绍

  1. 数据保存(putString)
  2. 获取数据(getString)
  3. 是否包含指定的key(has)
  4. 数据持久化(flush)
  5. 修改数据(update)
  6. 删除数据(delete)
  7. 清空数据(clear)

 三,创建单列GlobalContext,方便后期可以通过单例直接获取实例;由于get()返回值类型是不确定性,定义一个联合类型的别名ValueType 来接收

export default class GlobalContext {private constructor() {}private static instance: GlobalContextprivate _objects = new Map<string, Object>()public static getContext(): GlobalContext {if (!GlobalContext.instance) {GlobalContext.instance = new GlobalContext()}return GlobalContext.instance}getObject(value: string): Object | undefined {return this._objects.get(value)}setObject(key: string, objectClass: Object): void {this._objects.set(key, objectClass)}
}

四,创建PreferencesUtils工具类

import dataPreferences from '@ohos.data.preferences'
import GlobalContext from './GlobalContext'const TAG = "PreferencesUtils"
// 默认文件名,可以在构造函数进行修改
const PREFERENCES_NAME = 'dbPreferences'
const PREFERENCES_KEY = "preferences"
type ValueType = number | string | boolean | Array<number> | Array<string> | Array<boolean>;class PreferencesUtils{//  preferences的文件名-数据库表名private preferencesName: string = PREFERENCES_NAME// 用于获取preferences实例的key值,保存到单例中private keyPreferences: string = PREFERENCES_KEYconstructor(name: string = PREFERENCES_NAME, key: string = PREFERENCES_KEY) {this.preferencesName = namethis.keyPreferences = key}/*** 创建首选项实例* @param context 应用上下文* @returns 数据库表名*/initPreferences(context): Promise<dataPreferences.Preferences> {let preferences = dataPreferences.getPreferences(context, this.preferencesName)GlobalContext.getContext().setObject(this.keyPreferences, preferences)return}/*** 获取首选项实例* @returns*/getPreferences(): Promise<dataPreferences.Preferences> {return GlobalContext.getContext().getObject(this.keyPreferences) as Promise<dataPreferences.Preferences>}/*** 获取数据* @param key 读取key值* @param def 函数出参* @returns*/async getString(key: string, defaultValue?: ValueType): Promise<ValueType> {//在typescript中,空字符串、数字0、null、undefined都被认为是false,其他值为trueif (!key) {return defaultValue}return (await this.getPreferences()).get(key, defaultValue)}/*** 获取全部数据* @returns*/async getAll(): Promise<Object> {let preferences = await this.getPreferences()if (!preferences) {console.debug(TAG+'--->>>[getAll] Preferences实例为空')return}return preferences.getAll()}/*** 插入数据* @param key 插入key值* @param value 存储数据* @returns*/async putString(key: string, defaultValue: ValueType): Promise<void> {let promise = await this.getPreferences().then(async preferences => {// 插入数据await preferences.put(key, defaultValue)//写入文件await preferences.flush()}).catch(error => {console.error(TAG, `code:${error.code}, message:${error.message}`)})return promise}/*** 更新指定key的值* @param key  需要更新的key* @param newValue 新的值* @returns*/async update(key:string, newValue: ValueType):Promise<void>{if (!key) {throw new Error('Key cannot be empty!');}const preferences = await this.getPreferences()if (await preferences.has(key)) {//检查key是否存在await preferences.put(key, newValue); // 更新值await preferences.flush(); // 刷新以保存更改}else {throw new Error(`Key ${key} does not exist`); // 如果key不存在,抛出错误}}/*** 删除数据* @param key 删除key的value值* @returns*/async delete(key:string):Promise<void>{return (await this.getPreferences()).delete(key).finally(async ()=>{(await this.getPreferences()).flush()})}/*** 清空数据* @returns*/async clear():Promise<void>{return (await this.getPreferences()).clear().finally(async ()=>{(await this.getPreferences()).flush()})}
}export default new PreferencesUtils()

五,在EntryAbility中onCreate()方法初始化:

 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');//TODO 方法初始化PreferencesUtils.initPreferences(this.context)}

六,在pages中使用

import PreferencesUtils from '../dbSQL/PreferencesUtils';@Entry
@Component
struct Index {@State message: string = '';aboutToAppear(){PreferencesUtils.putString('userName','张三')PreferencesUtils.putString('age','18')PreferencesUtils.putString('sex','男')}async getAll(){this.message=JSON.stringify(await PreferencesUtils.getAll())console.log('getAll', this.message)}build() {Column({space:50}) {Text(this.message).fontSize(20).margin({top:30}).fontWeight(FontWeight.Bold)Column({space:20}){Button('getAll').onClick(async ()=>{this.getAll()})Button('put').onClick(async ()=>{//插入数据key相同时,会自动修改替换value值PreferencesUtils.putString('userName','李四')PreferencesUtils.putString('age','24')PreferencesUtils.putString('sex','女')this.getAll()})Button('update').onClick(async ()=>{await PreferencesUtils.update('userName','王二麻子')await PreferencesUtils.update('age','35')await PreferencesUtils.update('sex','男')this.getAll()})Button('delete').onClick(async ()=>{await PreferencesUtils.delete('sex')this.getAll()})Button('clear').onClick(async ()=>{await PreferencesUtils.clear()this.getAll()})}.margin({top:30}).justifyContent(FlexAlign.Center)}.width('100%')}
}

get查询
getAll查询
put
update

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

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

相关文章

SpringCloud 微服务消息队列灰度方案 (RocketMQ 4.x)

目录 背景遇到的问题 RocketMQ 基础基础消息模型扩展后的消息模型部署模型相关概念点 方案对比影子Topic的方案Tag的方案UserProperty的方案影子Group的方案灰度分区的方案方案对比 灰度分区方案设计适配只有部分灰度的情况所做的功能扩展消费者&#xff08;无灰度&#xff09;…

「QT」文件类 之 QDataStream 数据流类

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「Win」Windows程序设计「IDE」集成开发环境「UG/NX」BlockUI集合「C/C」C/C程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「UG/NX」NX定制…

QT<30> Qt中使鼠标变为转圈忙状态

前言&#xff1a;当我们在写软件时&#xff0c;在等待阻塞耗时操作时可以将鼠标变为忙状态&#xff0c;并在一段时间后恢复状态&#xff0c;可以用到GxtWaitCursor&#xff1a;Qt下基于RAII的鼠标等待光标类。 一、效果演示 二、详细代码 在项目中添加C文件&#xff0c;命名为…

Vue的基础使用

一、为什么要学习Vue 1.前端必备技能 2.岗位多&#xff0c;绝大互联网公司都在使用Vue 3.提高开发效率 4.高薪必备技能&#xff08;Vue2Vue3&#xff09; 二、什么是Vue 概念&#xff1a;Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套 构建用户界面 的 渐进式 框架…

数据结构Python版

2.3.3 双链表 双链表和链表一样&#xff0c;只不过每个节点有两个链接——一个指向后一个节点&#xff0c;一个指向前一个节点。此外&#xff0c;除了第一个节点&#xff0c;双链表还需要记录最后一个节点。 每个结点为DLinkNode类对象&#xff0c;包括存储元素的列表data、…

FBX福币交易所恒指收跌1.96% 半导体股继续回调

查查配分析11月14日电 周四,港股三大指数集体下跌。截至收盘,恒生指数跌1.96%,恒生科技指数跌3.08%,恒生中国企业指数跌2.21%。大市成交额1733亿港元。 FBX福币凭借用户友好的界面和对透明度的承诺,迅速在加密货币市场中崭露头角,成为广大用户信赖的平台。 来源:Wind 盘面上,科…

【学习日记】notebook添加JAVA支持

作者是个大学生 这个专栏主要收集课时常用的软件 以及女朋友上课用的软件的教程 新开了gitcode 用于上传安装包 环境说明 windows11 java23.0.1 ijava1.1.2 Anaconda-2024.02 需提前配置好java环境 本篇仅对添加支持进行说明 ijava的GitCode链接NotebookAddsSupportForJava:no…

RabbitMQ 篇-深入了解延迟消息、MQ 可靠性(生产者可靠性、MQ 可靠性、消费者可靠性)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 RabbitMQ 的可靠性 2.0 发送者的可靠性 2.1 生产者重试机制 2.2 生产者确认机制 2.2.1 开启生产者确认机制 2.2.2 定义 ReturnCallback 机制 2.2.3 定义 ConfirmC…

【数据结构】AVL树

引言&#xff1a;在实际情况中&#xff0c;数据不仅仅要存储起来&#xff0c;还要进行对数据进行搜索&#xff0c;为了方便进行高效搜索(在此之前的数据结构的搜索基本都是暴力搜索)二叉搜索树应运而生。但是在极端情况下(我们按照有序的方式进行插入)&#xff0c;二叉搜索树就…

CSS的综合应用例子(网页制作)

这是html的一些最基本内容的代码&#xff1a; <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <t…

MySQL查询某个数据库中特定表的空间占用大小

如果您也想要查询某个数据库中特定表的空间占用大小&#xff0c;包括数据和索引的大小&#xff0c;那么您可以使用以下SQL查询。这个查询将显示特定表在数据库中的数据大小、索引大小以及总大小。 SELECT table_name AS Table,ROUND(((data_length index_length) / 1024 / 10…

Towards Reasoning in Large Language Models: A Survey

文章目录 题目摘要引言什么是推理?走向大型语言模型中的推理测量大型语言模型中的推理发现与启示反思、讨论和未来方向 为什么要推理?结论题目 大型语言模型中的推理:一项调查 论文地址:https://arxiv.org/abs/2212.10403 项目地址: https://github.com/jeffhj/LM-reason…

进入未来城:第五周游戏指南

欢迎来到 Alpha 第 4 季第五周&#xff01; 走进霓虹闪烁的未来城街道&#xff0c;这是一座科技至上的赛博朋克大都市。鳞次栉比的摩天大楼熠熠生辉&#xff0c;拥挤的街道下则是阴森恐怖的地下世界。在这里&#xff0c;像激光鹰队长这样的超级战士正在巡逻&#xff0c;而 Ago…

斯坦福泡茶机器人DexCap源码解析:涵盖收集数据、处理数据、模型训练三大阶段

前言 因为我司「七月在线」关于dexcap的复现/优化接近尾声了(每月逐步提高复现的效果)&#xff0c;故准备把dexcap的源码也分析下&#xff0c;11月​下旬则分析下iDP3的源码——为队伍「iDP3人形的复现/优化」助力 最开始&#xff0c;dexcap的源码分析属于此文《DexCap——斯…

Python中的HTML

文章目录 一. HTML1. html的定义2. html的作用3. 基本结构4. 常用的html标签5. 列表标签① 无序列表② 有序列表 6. 表格标签7. 表单标签8. 表单提交① 表单属性设置② 表单元素属性设置 一. HTML 1. html的定义 HTML 的全称为&#xff1a;HyperText Mark-up Language, 指的是…

PdServer:调用MidjourneyAPI完成静夜思图文生成

欢迎沟通讨论&#xff0c;WX: cdszsz。公号&#xff1a;AIGC中文站。 今天我们将使用PdServer&#xff0c;通过Qwen大模型完成古诗的解析与prompt的生成&#xff0c;然后调用MidjourneyAPI完成图片的生成。有了文案和图片&#xff0c;我们就可以将其生成为一个古诗讲读视频。从…

论文 | The Capacity for Moral Self-Correction in LargeLanguage Models

概述 论文探讨了大规模语言模型是否具备“道德自我校正”的能力&#xff0c;即在收到相应指令时避免产生有害或偏见输出的能力。研究发现&#xff0c;当模型参数达到一定规模&#xff08;至少22B参数&#xff09;并经过人类反馈强化学习&#xff08;RLHF&#xff09;训练后&…

认证鉴权框架SpringSecurity-1--概念和原理篇

1、基本概念 Spring Security 是一个强大且高度可定制的框架&#xff0c;用于构建安全的 Java 应用程序。它是 Spring 生态系统的一部分&#xff0c;提供了全面的安全解决方案&#xff0c;包括认证、授权、CSRF防护、会话管理等功能。 2、认证、授权和鉴权 &#xff08;1&am…

删库跑路,启动!

起因&#xff1a;这是一个悲伤的故事&#xff0c;在抓logcat时 device待机自动回根目录了&#xff0c;而题主对当前路径的印象还停留在文件夹下&#xff0c;不小心在根目录执行了rm -rf * … 所以&#xff0c;这是个悲伤的故事&#xff0c;东西全没了…device也黑屏了&#xff…

unity单例模式的不同声明(待完善

总结&#xff1a; 这段代码实现了一个泛型单例模式&#xff08;Singleton Pattern&#xff09;&#xff0c;用于确保某个类&#xff08;由泛型参数 T 指定&#xff09;在整个应用程序中只有一个实例&#xff0c;并且在第一次访问时才创建该实例。该模式保证了该实例的全局唯一…