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

鸿蒙NEXT开发键值型数据工具类(ArkTs)

import { AppUtil } from './AppUtil';
import { distributedKVStore } from '@kit.ArkData';
import { BusinessError } from '@kit.BasicServicesKit';/*** 键值型数据库工具类* @author CSDN-鸿蒙布道师* @since 2025/04/18*/
export class KvUtil {private static kvStore: distributedKVStore.SingleKVStore; // KVStore数据库实例/*** 获取KVStore数据库实例* @returns Promise<distributedKVStore.SingleKVStore>*/private static async getKvStore(): Promise<distributedKVStore.SingleKVStore> {if (!KvUtil.kvStore) {const kvManager = distributedKVStore.createKVManager({context: AppUtil.getContext(),bundleName: AppUtil.getBundleName(),});const options: distributedKVStore.Options = {createIfMissing: true, // 数据库不存在时是否创建encrypt: true, // 是否加密数据库backup: false, // 是否支持备份autoSync: false, // 是否跨设备自动同步kvStoreType: distributedKVStore.KVStoreType.SINGLE_VERSION, // 数据库类型securityLevel: distributedKVStore.SecurityLevel.S1, // 数据库安全级别};KvUtil.kvStore = await kvManager.getKVStore('harmony_utils_store', options);}return KvUtil.kvStore;}/*** 添加指定类型的键值对到数据库* @param key 键* @param value 值(支持 Uint8Array | string | number | boolean)*/static async put(key: string, value: Uint8Array | string | number | boolean): Promise<void> {const kvStore = await KvUtil.getKvStore();await kvStore.put(key, value);}/*** 获取指定键的值,支持默认值* @param key 键* @param defValue 默认值* @returns Promise<T | undefined>*/private static async getValue<T>(key: string, defValue?: T): Promise<T | undefined> {const kvStore = await KvUtil.getKvStore();try {const value = await kvStore.get(key);// 使用类型断言确保返回值符合 T 类型return (value !== undefined && value !== null ? value as T : defValue);} catch (error) {console.error(`KvUtil-getValue Error: ${error}`);return defValue;}}/*** 获取字符串类型的值* @param key 键* @param defValue 默认值*/static async getString(key: string, defValue = ''): Promise<string> {return (await KvUtil.getValue<string>(key, defValue)) ?? '';}/*** 获取数字类型的值* @param key 键* @param defValue 默认值*/static async getNumber(key: string, defValue = 0): Promise<number> {return (await KvUtil.getValue<number>(key, defValue)) ?? 0;}/*** 获取布尔类型的值* @param key 键* @param defValue 默认值*/static async getBoolean(key: string, defValue = false): Promise<boolean> {return (await KvUtil.getValue<boolean>(key, defValue)) ?? false;}/*** 获取 Uint8Array 类型的值* @param key 键* @param defValue 默认值*/static async getUint8Array(key: string, defValue: Uint8Array = new Uint8Array()): Promise<Uint8Array> {return (await KvUtil.getValue<Uint8Array>(key, defValue)) ?? new Uint8Array();}/*** 删除指定键的值* @param key 键*/static async delete(key: string): Promise<void> {const kvStore = await KvUtil.getKvStore();await kvStore.delete(key);}/*** 批量插入键值对* @param entries 键值对数组*/static async putBatch(entries: distributedKVStore.Entry[]): Promise<void> {const kvStore = await KvUtil.getKvStore();await kvStore.putBatch(entries);}/*** 批量删除键值对* @param keys 键数组*/static async deleteBatch(keys: string[]): Promise<void> {const kvStore = await KvUtil.getKvStore();await kvStore.deleteBatch(keys);}/*** 获取匹配指定键前缀的所有键值对* @param keyPrefix 键前缀*/static async getEntries(keyPrefix: string): Promise<distributedKVStore.Entry[]> {const kvStore = await KvUtil.getKvStore();return kvStore.getEntries(keyPrefix);}/*** 备份数据库* @param file 备份文件名*/static async backup(file: string): Promise<void> {const kvStore = await KvUtil.getKvStore();await kvStore.backup(file);}/*** 恢复数据库* @param file 备份文件名*/static async restore(file: string): Promise<void> {const kvStore = await KvUtil.getKvStore();await kvStore.restore(file);}/*** 删除备份文件* @param files 备份文件名数组*/static async deleteBackup(files: string[]): Promise<Array<[string, number]>> {const kvStore = await KvUtil.getKvStore();return kvStore.deleteBackup(files);}/*** 订阅数据变更通知* @param type 订阅类型* @param listener 回调函数*/static async onDataChange(type: distributedKVStore.SubscribeType,listener: Callback<distributedKVStore.ChangeNotification>): Promise<void> {const kvStore = await KvUtil.getKvStore();kvStore.on('dataChange', type, listener);}/*** 取消订阅数据变更通知* @param listener 回调函数(不传则取消所有订阅)*/static async offDataChange(listener?: Callback<distributedKVStore.ChangeNotification>): Promise<void> {const kvStore = await KvUtil.getKvStore();if (listener) {kvStore.off('dataChange', listener);} else {kvStore.off('dataChange');}}
}

代码如下:

import { AppUtil } from './AppUtil';
import { distributedKVStore } from '@kit.ArkData';
import { BusinessError } from '@kit.BasicServicesKit';/*** 键值型数据库工具类* @author CSDN-鸿蒙布道师* @since 2025/04/18*/
export class KvUtil {private static kvStore: distributedKVStore.SingleKVStore; // KVStore数据库实例/*** 获取KVStore数据库实例* @returns Promise<distributedKVStore.SingleKVStore>*/private static async getKvStore(): Promise<distributedKVStore.SingleKVStore> {if (!KvUtil.kvStore) {const kvManager = distributedKVStore.createKVManager({context: AppUtil.getContext(),bundleName: AppUtil.getBundleName(),});const options: distributedKVStore.Options = {createIfMissing: true, // 数据库不存在时是否创建encrypt: true, // 是否加密数据库backup: false, // 是否支持备份autoSync: false, // 是否跨设备自动同步kvStoreType: distributedKVStore.KVStoreType.SINGLE_VERSION, // 数据库类型securityLevel: distributedKVStore.SecurityLevel.S1, // 数据库安全级别};KvUtil.kvStore = await kvManager.getKVStore('harmony_utils_store', options);}return KvUtil.kvStore;}/*** 添加指定类型的键值对到数据库* @param key 键* @param value 值(支持 Uint8Array | string | number | boolean)*/static async put(key: string, value: Uint8Array | string | number | boolean): Promise<void> {const kvStore = await KvUtil.getKvStore();await kvStore.put(key, value);}/*** 获取指定键的值,支持默认值* @param key 键* @param defValue 默认值* @returns Promise<T | undefined>*/private static async getValue<T>(key: string, defValue?: T): Promise<T | undefined> {const kvStore = await KvUtil.getKvStore();try {const value = await kvStore.get(key);// 使用类型断言确保返回值符合 T 类型return (value !== undefined && value !== null ? value as T : defValue);} catch (error) {console.error(`KvUtil-getValue Error: ${error}`);return defValue;}}/*** 获取字符串类型的值* @param key 键* @param defValue 默认值*/static async getString(key: string, defValue = ''): Promise<string> {return (await KvUtil.getValue<string>(key, defValue)) ?? '';}/*** 获取数字类型的值* @param key 键* @param defValue 默认值*/static async getNumber(key: string, defValue = 0): Promise<number> {return (await KvUtil.getValue<number>(key, defValue)) ?? 0;}/*** 获取布尔类型的值* @param key 键* @param defValue 默认值*/static async getBoolean(key: string, defValue = false): Promise<boolean> {return (await KvUtil.getValue<boolean>(key, defValue)) ?? false;}/*** 获取 Uint8Array 类型的值* @param key 键* @param defValue 默认值*/static async getUint8Array(key: string, defValue: Uint8Array = new Uint8Array()): Promise<Uint8Array> {return (await KvUtil.getValue<Uint8Array>(key, defValue)) ?? new Uint8Array();}/*** 删除指定键的值* @param key 键*/static async delete(key: string): Promise<void> {const kvStore = await KvUtil.getKvStore();await kvStore.delete(key);}/*** 批量插入键值对* @param entries 键值对数组*/static async putBatch(entries: distributedKVStore.Entry[]): Promise<void> {const kvStore = await KvUtil.getKvStore();await kvStore.putBatch(entries);}/*** 批量删除键值对* @param keys 键数组*/static async deleteBatch(keys: string[]): Promise<void> {const kvStore = await KvUtil.getKvStore();await kvStore.deleteBatch(keys);}/*** 获取匹配指定键前缀的所有键值对* @param keyPrefix 键前缀*/static async getEntries(keyPrefix: string): Promise<distributedKVStore.Entry[]> {const kvStore = await KvUtil.getKvStore();return kvStore.getEntries(keyPrefix);}/*** 备份数据库* @param file 备份文件名*/static async backup(file: string): Promise<void> {const kvStore = await KvUtil.getKvStore();await kvStore.backup(file);}/*** 恢复数据库* @param file 备份文件名*/static async restore(file: string): Promise<void> {const kvStore = await KvUtil.getKvStore();await kvStore.restore(file);}/*** 删除备份文件* @param files 备份文件名数组*/static async deleteBackup(files: string[]): Promise<Array<[string, number]>> {const kvStore = await KvUtil.getKvStore();return kvStore.deleteBackup(files);}/*** 订阅数据变更通知* @param type 订阅类型* @param listener 回调函数*/static async onDataChange(type: distributedKVStore.SubscribeType,listener: Callback<distributedKVStore.ChangeNotification>): Promise<void> {const kvStore = await KvUtil.getKvStore();kvStore.on('dataChange', type, listener);}/*** 取消订阅数据变更通知* @param listener 回调函数(不传则取消所有订阅)*/static async offDataChange(listener?: Callback<distributedKVStore.ChangeNotification>): Promise<void> {const kvStore = await KvUtil.getKvStore();if (listener) {kvStore.off('dataChange', listener);} else {kvStore.off('dataChange');}}
}

相关文章:

鸿蒙NEXT开发键值型数据工具类(ArkTs)

import { AppUtil } from ./AppUtil; import { distributedKVStore } from kit.ArkData; import { BusinessError } from kit.BasicServicesKit;/*** 键值型数据库工具类* author CSDN-鸿蒙布道师* since 2025/04/18*/ export class KvUtil {private static kvStore: distribut…...

【数字图像处理】立体视觉信息提取

双目立体视觉原理 设一个为参考平面&#xff0c;一个为目标平面。增加了一个摄像头后&#xff0c;P与Q在目标面T上有分别的成像点 双目立体视觉&#xff1a;从两个不同的位置观察同一物体&#xff0c;用三角测量原理计算摄像机到该物体的距离的 方法 原理&#xff1a;三角测量…...

Linux ssh免密登陆设置

使用 ssh-copy-id 命令来设置 SSH 免密登录&#xff0c;并确保所有相关文件和目录权限正确设置&#xff0c;可以按照以下步骤进行&#xff1a; 步骤 1&#xff1a;在源服务器&#xff08;198.120.1.109&#xff09;生成 SSH 密钥对 如果还没有生成 SSH 密钥对&#xff0c;首先…...

CentOS7执行yum命令报错 Could not retrieve mirrorlist http://mirrorlist.centos.org

CentOS7执行yum命令报错 引更新yum源备份原有源创建新的源文件清理并重建缓存 引 CentOS 7 系统无法连接到 CentOS 的官方镜像站点。这通常是由于网络问题或 CentOS 7 已停止维护导致的&#xff08;2024年6月30日后 CentOS 7 已进入 EOL&#xff09; 报错明细&#xff1a; 已…...

【漏洞复现】Struts2系列

【漏洞复现】Struts2系列 1. 了解Struts21. Struts2 S2-061 RCE &#xff08;CVE-2020-17530&#xff09;1. 漏洞描述2. 影响版本3. 复现过程 1. 了解Struts2 Apache Struts2是一个基于MVC设计模式的Web应用框架&#xff0c;会对某些标签属性&#xff08;比如 id&#xff09;的…...

Sentinel源码—5.FlowSlot借鉴Guava的限流算法二

大纲 1.Guava提供的RateLimiter限流使用示例 2.Guava提供的RateLimiter简介与设计 3.继承RateLimiter的SmoothBursty源码 4.继承RateLimiter的SmoothWarmingUp源码 3.继承RateLimiter的SmoothBursty源码 (1)SmoothBursty的初始化流程 (2)SmoothBursty的初始化完成后的变量…...

下载electron 22.3.27 源码错误集锦

下载步骤同 electron源码下载及编译_electron源码编译-CSDN博客 问题1 从github 下载 dugite超时&#xff0c;原因没有找到 Validation failed. Expected 8ea2d0d3c9d9e4615069913207371ffe892dc10fb93975972f2f6e668f2e3b3a but got e3b0c44298fc1c149afbf4c8996fb92427ae41e…...

安卓的桌面 launcher是什么

安卓的桌面Launcher是一种安卓应用程序&#xff0c;它主要负责管理和展示手机主屏幕的界面以及相关功能&#xff0c;为用户提供与设备交互的主要入口。以下是其详细介绍&#xff1a; 功能 主屏幕管理&#xff1a;用户可以在主屏幕上添加、删除和排列各种应用程序图标、小部件…...

基础数学知识-线性代数

1. 矩阵相乘 c i j = a i k ∗ b k j c_{ij} = a_{ik} * b_{kj} cij​=aik​∗bkj​ 1. 范数 1. 向量的范数 任意一组向量设为 x ⃗ = ( x 1 , x 2 , . . . , x N ) \vec{x}=(x_1,x_2,...,x_N) x =(x1​,x2​,...,xN​) 如下: 向量的1范数: 向量的各个元素的绝对值之和∥ …...

kubeadm极速部署Kubernetes 1.26.X 版本集群

1.1 Kubernetes 1.26版本集群部署环境准备 1.1.1 主机操作系统说明 序号操作系统及版本备注1CentOS7u9 1.1.2 主机硬件配置说明 需求CPU内存硬盘角色主机名值4C8G100GBmastermaster01值4C8G100GBworker(node)node01值4C8G100GBworker(node)node02 1.1.3 主机配置 1.1.3.1…...

重构未来智能:Anthropic 解码Agent设计哲学三重奏

第一章 智能体进化论&#xff1a;从工具到自主体的认知跃迁 1.1 LLM应用范式演进图谱 阶段技术形态应用特征代表场景初级阶段单功能模型硬编码规则执行文本摘要/分类进阶阶段工作流编排多模型协同调度跨语言翻译流水线高级阶段自主智能体动态决策交互编程调试/客服对话 1.1.…...

互联网大厂Java面试:微服务与分布式系统挑战

互联网大厂Java面试&#xff1a;微服务与分布式系统挑战 在互联网的大潮中&#xff0c;无数程序员怀揣着梦想&#xff0c;希望能在一线大厂找到自己的位置。今天的故事主角是马飞机&#xff0c;一位充满幽默感但技术略显水货的程序员。他来到了一家知名互联网公司参加Java开发…...

Gradle与Idea整合

文章目录 1. Groovy 简介2. Groovy 安装[非必须]3. 在idea中创建java工程 1. Groovy 简介 在某种程度上&#xff0c;Groovy可以被视为Java的一种脚本化改良版,Groovy也是运行在JVM上&#xff0c;它可以很好地与Java代码及其相关库进行交互操作。它是一种成熟的面向对象编程语言…...

基于springboot+vue的校园二手物品交易平台

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…...

PoCL环境搭建

PoCL环境搭建 **一.关键功能与优势****二.设计目的****三.测试步骤**1.创建容器2.安装依赖3.编译安装pocl4.运行OpenCL测试程序 Portable Computing Language (PoCL) 简介 Portable Computing Language (PoCL) 是一个开源的、符合标准的异构计算框架&#xff0c;旨在为 OpenCL…...

【前端Skill】点击目标元素定位跳转IDE中的源代码

参考&#xff1a;https://juejin.cn/post/7326002010084311079 快手开源项目&#xff1a; https://github.com/zh-lx/code-inspector 目前在umi项目中用到 记录一下umi项目中如何使用 安装 npm i code-inspector-plugin -D --registryhttps://registry.npmmirror.com/ 配…...

OpenCV图像上加数字水印示例

OpenCV计算机视觉开发实践&#xff1a;基于Qt C - 商品搜索 - 京东 14.1 基本概念 当今&#xff0c;生成式人工智能&#xff08;Artificial Intelligence Generated Content&#xff0c;AIGC&#xff09;的火爆引燃了数字水印&#xff0c;说实话数字水印并不是一项新的技术&…...

Python爬虫从入门到实战详细版教程Char01:爬虫基础与核心技术

1.1 什么是网络爬虫? 1.1.1 定义与分类 网络爬虫:互联网世界的“信息捕手” 网络爬虫(Web Crawler),又称网络蜘蛛或网络机器人,是一种通过预设规则自动访问网页、提取数据的程序系统。从技术视角看,其核心任务是通过模拟浏览器行为向目标服务器发起请求,解析网页内容…...

使用blob文件流

1.后端 GetMapping(value "/static/**")public void view(HttpServletRequest request, HttpServletResponse response) {// ISO-8859-1 > UTF-8 进行编码转换String imgPath extractPathFromPattern(request);if(oConvertUtils.isEmpty(imgPath) || imgPath&q…...

Day-1 漏洞攻击实战

实训任务1 漏洞攻击实战一 使用 御剑 得到网站后台地址 数据库登录与日志配置​​ 使用默认密码 root:root 登录phpMyAdmin&#xff0c;执行 SHOW VARIABLES LIKE general% 查看日志状态。 开启日志功能&#xff1a;set global general_log "ON";&#xff08;配图&…...

AOSP Android14 Launcher3——RecentsView最近任务数据加载

最近任务是Launcher中的一个重要的功能&#xff0c;显示用户最近使用的应用&#xff0c;并可以快速切换到其中的应用&#xff1b;用户可以通过底部上滑停顿进入最近任务&#xff0c;也可以在第三方应用底部上滑进最近任务。 这两种场景之前的博客也介绍过&#xff0c;本文就不…...

基于深度学习的校园食堂菜品智能结算系统

校园食堂菜品智能结算系统说明文档 1. 系统概述 本系统是一款基于YOLO深度学习算法的校园食堂菜品智能结算平台&#xff0c;旨在通过计算机视觉技术实现食堂菜品的自动识别与结算&#xff0c;提高结算效率&#xff0c;减少人工成本&#xff0c;优化用户体验。系统采用PyQt5框…...

【UniApp】Vue2 scss 预编译器默认已由 node-sass 更换为 dart-sass

从 HBuilderX 4.56 &#xff0c;vue2 项目也将默认使用 dart-sass 预编译器。 vue2开发者sass预处理注意&#xff1a; sass的预处理器&#xff0c;早年使用node-sass&#xff0c;也就是vue2最初默认的编译器。 sass官方推出了dart-sass来替代。node-sass已经停维很久了。 另…...

AI 硬件定制:开启智能新时代的钥匙

AI 硬件定制:开启智能新时代的钥匙 在科技飞速发展的当下,人工智能(AI)已不再是遥不可及的概念,它正以惊人的速度融入我们生活的方方面面。从智能手机中的语音助手,到工厂里的自动化生产线,AI 的身影无处不在。而在这股 AI 浪潮中,AI 硬件定制正逐渐崭露头角,成为推动…...

SpringBoot中配置文件的加载顺序

下面的优先级由高到低 命令行参数java系统属性java系统环境变量外部config文件夹的application-{profile}.ym文件外部的application-{profile}.ym文件内部config文件夹的application-{profile}.ym文件内部的application-{profile}.ym文件外部config文件夹的application.ym文件外…...

hooker frida版just_trust_me.js 2025升级 支持boringssl unpinning

曾几何时&#xff0c;我翻版了 Xposed 的 just_trust_me.apk&#xff0c; just_trust_me.js 脚本仿佛是一张通行证&#xff0c;让我们在 SSL Pinning 的高墙前轻松穿越。 但时代变了。BoringSSL、Cronet、静态 inline hook、动态 verify callback……一切都变得更加隐蔽和棘手…...

React Article模块

实现基础文章发布 安装富文本编辑器 使用useEffect钩子函数获取到channelList,对channelList函数进行一个遍历 渲染到option 实现表单校验 1给Form组件绑定onFinish()函数 拼接表单数据 上传封面 onChange函数获得的参数...

机器学习第二篇 多变量线性回归

数据集&#xff1a;世界幸福指数数据集中的变量有幸福指数排名、国家/地区、幸福指数得分、人均国内生产总值、健康预期寿命、自由权、社会支持、慷慨程度、清廉指数。我们选择GDP per Capita和Freedom&#xff0c;来预测幸福指数得分。 文件一&#xff1a;linear&#xff0c;…...

C语言对n进制的处理

先看一道题目: 从键盘获取一个正整数,如果把它转为16进制的数字,那么它是一个几位数呢?如果把它转为28进制又是一个几位数呢? 在讲这个题目之前,我们先要了解进制转换 什么是进制转换&#xff1f; 简单来说&#xff0c;进制就是数位的表示方法。 十进制&#xff08;常用&am…...

【EasyPan】文件上传、文件秒传、文件转码、文件合并、异步转码、视频切割分析

【EasyPan】项目常见问题解答&#xff08;自用&持续更新中…&#xff09;汇总版 文件上传方法解析 一、方法总览 Transactional(rollbackFor Exception.class) public UploadResultDto uploadFile(...)核心能力&#xff1a; 秒传验证&#xff1a;通过MD5文件大小实现文…...