IndexDB封装

2024-06-19 15:04
文章标签 封装 indexdb

本文主要是介绍IndexDB封装,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

理论知识

/*** 打开/创建数据库* @param {object} dbName 数据库的名字* @param {string} storeName 仓库名称* @param {string} version 数据库的版本* @param {string} keyPath 主键键值,不传就自动创建主键* @param {Array} index 索引数组* @return {object} 该函数会返回一个数据库实例*/
type StoreOptions = {autoIncrement: boolean;keyPath?: string;
};
const openDB = function (dbName: string,version: number,storeName: string,keyPath?: string,index?: Array<any[]> | undefined
) {return new Promise((resolve, reject) => {//  兼容浏览器// eslint-disable-next-line @typescript-eslint/ban-ts-comment// @ts-ignoreconst { webkitIndexedDB, indexedDB, mozIndexedDB, msIndexedDB } = window;const indexDB = indexedDB || mozIndexedDB || webkitIndexedDB || msIndexedDB;let db = null;const request = indexDB.open(dbName, version);// 操作成功request.onsuccess = function (event: any) {db = event?.target?.result; // 数据库对象resolve({ code: 0, success: true, data: db, msg: "数据库打开成功!" });};// 操作失败request.onerror = function (e: any) {resolve({ code: -1, success: false, data: e, msg: "数据库打开失败!" });};// 创建表和索引request.onupgradeneeded = function (event: any) {// 数据库创建或升级的时候会触发db = event?.target?.result; // 数据库对象const storeOptions: StoreOptions = {autoIncrement: true,};if (keyPath && keyPath !== "") {storeOptions.autoIncrement = false;storeOptions.keyPath = keyPath;}// 创建表if (!db.objectStoreNames.contains(storeName)) {const store = db.createObjectStore(storeName, storeOptions);// 创建索引// indexName索引列名称// indexKey索引键值if (index && index.length > 0) {index.forEach((item: any) => {if (!item.indexName ||!item.indexKey ||item.options.unique === undefined) {window.indexedDB.deleteDatabase(dbName);reject("索引格式错误,请参照格式{indexName:'indexName',indexKey:'indexKey',options:{unique: false}}");}store.createIndex(item.indexName, item.indexKey, item.options);});}}};});
};/*** 新增数据* @param {object} db 数据库实例* @param {string} storeName 仓库名称* @param {object} dataConfig 添加的数据集合**/
const addData = function (db: any, storeName: string, dataConfig: any) {return new Promise((resolve, reject) => {if (!db) {reject("数据库不存在或没有初始化");}const req = db.transaction([storeName], "readwrite").objectStore(storeName) // 仓库对象.add(dataConfig);// 操作成功req.onsuccess = function () {resolve({ code: 0, success: true, data: null, msg: "数据写入成功!" });};// 操作失败req.onerror = function (e: any) {const data = {code: -1,success: false,data: e,msg: "数据写入失败!",};resolve(data);};});
};/*** 更新数据* @param {object} db 数据库实例* @param {string} storeName 仓库名称* @param {object} dataConfig 更新的数据集合*/
const updateData = function (db: any,storeName: string,dataConfig: any,keyPath: any
) {return new Promise((resolve, reject) => {if (!db) {reject("数据库不存在或没有初始化");}const req = db.transaction([storeName], "readwrite").objectStore(storeName).put(dataConfig, keyPath);// 操作成功req.onsuccess = function () {resolve({ code: 0, success: true, data: null, msg: "数据更新成功!" });};// 操作失败req.onerror = function (e: any) {const data = {code: -1,success: false,data: e,msg: "数据更新失败!",};resolve(data);};});
};/*** 删除数据* @param {object} db 数据库实例* @param {string} storeName 仓库名称* @param {string} key 数据主键**/
const deleteData = function (db: any, storeName: string, key: any) {return new Promise((resolve, reject) => {if (!db) {reject("数据库不存在或没有初始化");}const req = db.transaction([storeName], "readwrite").objectStore(storeName) // 仓库对象.delete(key);// 操作成功req.onsuccess = function (e: { target: { result: any } }) {resolve({code: 0,success: true,data: e?.target?.result,msg: "数据删除成功!",});};// 操作失败req.onerror = function () {const data = {code: -1,success: false,data: null,msg: "数据删除失败!",};resolve(data);};});
};/*** 查询数据* @param {object} db 数据库实例* @param {string} storeName 仓库名称* @param {string} key 数据主键**/
const getDataByKey = function (db: any, storeName: string, key: any) {return new Promise((resolve, reject) => {if (!db) {reject("数据库不存在或没有初始化");}const req = db.transaction([storeName], "readonly").objectStore(storeName) // 仓库对象.get(key);// 操作成功req.onsuccess = function (e: any) {resolve({code: 0,success: true,data: e?.target?.result,msg: "数据获取成功!",});};// 操作失败req.onerror = function (e: any) {const data = {code: -1,success: false,data: e,msg: "数据获取失败!",};resolve(data);};});
};/*** 使用游标查询数据* @param {object} db 数据库实例* @param {string} storeName 仓库名称**/
const getDataByCursor = (db: any, storeName: any) => {return new Promise((resolve, reject) => {if (!db) {reject("数据库不存在或没有初始化");}const list: any = [];const req = db.transaction(storeName, "readonly") // 事务.objectStore(storeName) // 仓库对象.openCursor(); // 指针对象req.onsuccess = function (e: any) {const cursor = e.target.result;if (cursor) {// 必须要检查list.push(cursor.value);cursor.continue(); // 遍历了存储对象中的所有内容} else {const data = {code: 0,success: true,data: list,msg: "数据获取成功!",};resolve(data);}};req.onerror = function (e: any) {const data = {code: -1,success: false,data: e,msg: "数据获取失败!",};resolve(data);};});
};/*** 通过索引读取数据* @param {object} db 数据库实例* @param {string} storeName 仓库名称* @param {string} key 数据主键**/
const getDataByIndex = function (db: any,storeName: any,indexName: any,indexValue: any
) {return new Promise((resolve, reject) => {if (!db) {reject("数据库不存在或没有初始化");}const req = db.transaction([storeName], "readonly").objectStore(storeName) // 仓库对象.index(indexName).get(indexValue);// 操作成功req.onsuccess = function (e: { target: { result: any } }) {resolve({code: 0,success: true,data: e?.target?.result,msg: "数据获取成功!",});};// 操作失败req.onerror = function (e: any) {const data = {code: -1,success: false,data: e,msg: "数据获取失败!",};resolve(data);};});
};/*** 通过索引和游标查询记录* @param {object} db 数据库实例* @param {string} storeName 仓库名称* @param {string} key 数据主键**/
export function getDataBYCursorAndIndex(db: any,storeName: any,indexName: any,indexValue: any
) {return new Promise((resolve, reject) => {if (!db) {reject("数据库不存在或没有初始化");}const list: any = [];const req = db.transaction(storeName, "readonly").objectStore(storeName) // 仓库对象.index(indexName) // 索引对象.openCursor(IDBKeyRange.only(indexValue)); // 指针对象req.onsuccess = function (e: any) {const cursor = e.target.result;if (cursor) {// 必须要检查list.push(cursor.value);cursor.continue(); // 遍历了存储对象中的所有内容} else {const data = {code: 0,success: true,data: list,msg: "数据获取成功!",};resolve(data);}};req.onerror = function (e: any) {const data = {code: -1,success: false,data: e,msg: "数据获取失败!",};resolve(data);};});
}
/*** 关闭数据库*/
export function closeDB(db: any) {return new Promise((resolve, reject) => {if (!db) {reject("数据库不存在或没有初始化");}db.close();});
}
export default {openDB,addData,updateData,deleteData,getDataByKey,getDataByCursor,getDataByIndex,getDataBYCursorAndIndex,closeDB,
};

这篇关于IndexDB封装的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1075363

相关文章

鸿蒙中Axios数据请求的封装和配置方法

《鸿蒙中Axios数据请求的封装和配置方法》:本文主要介绍鸿蒙中Axios数据请求的封装和配置方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.配置权限 应用级权限和系统级权限2.配置网络请求的代码3.下载在Entry中 下载AxIOS4.封装Htt

SpringBoot中封装Cors自动配置方式

《SpringBoot中封装Cors自动配置方式》:本文主要介绍SpringBoot中封装Cors自动配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot封装Cors自动配置背景实现步骤1. 创建 GlobalCorsProperties

Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)

《Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)》:本文主要介绍Java导入、导出excel的相关资料,讲解了使用Java和ApachePOI库将数据导出为Excel文件,包括... 目录前言一、引入Apache POI依赖二、用法&步骤2.1 创建Excel的元素2.3 样式和字体2.

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

Go语言利用泛型封装常见的Map操作

《Go语言利用泛型封装常见的Map操作》Go语言在1.18版本中引入了泛型,这是Go语言发展的一个重要里程碑,它极大地增强了语言的表达能力和灵活性,本文将通过泛型实现封装常见的Map操作,感... 目录什么是泛型泛型解决了什么问题Go泛型基于泛型的常见Map操作代码合集总结什么是泛型泛型是一种编程范式,允

JavaSE——封装、继承和多态

1. 封装 1.1 概念      面向对象程序三大特性:封装、继承、多态 。而类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说就是套壳屏蔽细节 。     比如:对于电脑这样一个复杂的设备,提供给用户的就只是:开关机、通过键盘输入,显示器, USB 插孔等,让用户来和计算机进行交互,完成日常事务。但实际上:电脑真正工作的却是CPU 、显卡、内存等一些硬件元件。

哈希表的封装和位图

文章目录 2 封装2.1 基础框架2.2 迭代器(1)2.3 迭代器(2) 3. 位图3.1 问题引入3.2 左移和右移?3.3 位图的实现3.4 位图的题目3.5 位图的应用 2 封装 2.1 基础框架 文章 有了前面map和set封装的经验,容易写出下面的代码 // UnorderedSet.h#pragma once#include "HashTable.h"

封装MySQL操作时Where条件语句的组织

在对数据库进行封装的过程中,条件语句应该是相对难以处理的,毕竟条件语句太过于多样性。 条件语句大致分为以下几种: 1、单一条件,比如:where id = 1; 2、多个条件,相互间关系统一。比如:where id > 10 and age > 20 and score < 60; 3、多个条件,相互间关系不统一。比如:where (id > 10 OR age > 20) AND sco

Java封装构造方法

private/public的分装 被public修饰的成员变量或者是成员方法,可以被类的调用对象直接使用 而private修饰的成员变量和方法,不能被类的调用对象使用 例如: 可以看到我们是不能在main方法中直接调用被private修饰的变量 当然我们可以在我们定义的TestMode类中可以定一个方法show,然后在调用show方法实现 这里我们可以清楚了解 private 不光可以修