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

ops/2024/11/18 7:57:43/

一,用户首选项简述

@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.ppmy.cn/ops/134654.html

相关文章

tiktok 视频详情接口API服务

文章目录 请求示例响应示例 请求示例 def get_tk_detail():tk app 视频详情:return:aweme_id 7417899155944672530token xxxxxxxxurl f"http://xxxxxxxx:3333/tk/detail?token{token}&aweme_id{aweme_id}"res requests.get(url)print(res.json())响应示例 …

【论文阅读】(Security) Assertions by Large Language Models

论文笔记:(Security) Assertions by Large Language Models 来源:IEEE TRANSACTIONS ON INFORMATION FORENSICS AND SECURITY I. 引言 计算机系统的安全性通常依赖于硬件的根信任。硬件漏洞可能对系统造成严重影响,因此需要支持安全验证的技术。断言验证是一种流行的验证…

台式电脑没有声音怎么办?台式电脑没有声音解决详解

台式电脑一般来说都是没有内置扬声器的&#xff0c;需要连接耳机或者是音响才可以播放音乐。那么如果遇到台式电脑没有声音的问题&#xff0c;我们也需要确认这些设备硬件有没问题&#xff0c;知道原因才可以进行处理。下面本文将为你介绍台式电脑没有声音的可能原因和解决方法…

代码随想录刷题学习日记

仅为个人记录复盘学习历程&#xff0c;解题思路来自代码随想录 代码随想录刷题笔记总结网址:代码随想录 90.子集II 给定一个可能包含重复元素的整数数组 nums&#xff0c;返回该数组所有可能的子集&#xff08;幂集&#xff09;。 说明&#xff1a;解集不能包含重复的子集。…

初识网络原理

1.网络互联 网络互联就是将多台计算机连接在一起&#xff0c;完成数据共享。 数据共享本质就是网络数据传输&#xff0c;即计算机之间通过网络来传输数据&#xff0c;也称为网络通信。 根据网络互联的规模不同&#xff0c;可以划分为局域网和广域网。 1.1 局域网 局域网&am…

uni-app快速入门(六)--rpx尺寸单位与Flex布局

一、uni-app尺寸单位 uni-app支持的通用尺寸单位包括px、rpx。为支持跨平台&#xff0c;在搭建空驾驶建议使用Flex布局。px指屏幕像素&#xff0c;rpx是响应式像素&#xff0c;是根据屏幕宽度自适应的动态单位。假如屏幕宽度为750像素&#xff0c;750rpx正好为屏幕宽度。uni-ap…

2024年09月CCF-GESP编程能力等级认证Python编程四级真题解析

本文收录于专栏《Python等级认证CCF-GESP真题解析》,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 一、单选题(每题 2 分,共 30 分) 第 1 题 据有关资料,山东大学于1972年研制成功DJL-1计算机,并于1973年投入运行,其综合性能居当时全国第三位。DJL-1计算机运算控…

Spark RDD中常用聚合算子源码层面的对比分析

在 Spark RDD 中&#xff0c;groupByKey、reduceByKey、foldByKey 和 aggregateByKey 是常用的聚合算子&#xff0c;适用于按键进行数据分组和聚合。它们的实现方式各不相同&#xff0c;涉及底层调用的函数也有区别。以下是对这些算子在源码层面的分析&#xff0c;以及每个算子…