indexeddb 二次封装

news/2024/10/17 10:33:27/

1、封装一个indexedDB的使用类库(CreateDB)

// business database
const dbMap = {defaultDBName: "local_basic_db"
};// Database default storage space (database table)
let defaultDBTable = "basic_table";
// default database version
let defaultVersion = 1;class CreateDB {constructor (config = {}) {let dbName = config?.dbName || dbMap.defaultDBName;let dbTable = config?.dbTable || defaultDBTable;this.dbName = dbName;this.version = defaultVersion;this.dbTable = dbTable;this.databases = [];this.initialization();}// initializationasync initialization() {const database = await this.checkDB({ dbName: this.dbName });if (database) {this.version = database.version;}console.log("Initialization completed", database);}// Connect to the databaseopenDB() {const db = window.indexedDB.open(this.dbName, this.version);return db;}// Get all databases under the browserasync getDBS() {const res = await window.indexedDB.databases().catch(() => {return [];});this.databases = res;return res;}// Check if the specified database existsasync checkDB({ dbName }) {if (dbName) {const databaseList = await this.getDBS();if (databaseList.length) {let database;for (let i = 0; i < databaseList.length; i++) {let curr = databaseList[i];if (curr.name === dbName) {database = curr;break;}}return database;}}return null;}// Check if the storage space existscheckTable({ db, dbTable }) {const objectStoreNames = db.objectStoreNames;return objectStoreNames.contains(dbTable);}// Data addition methodasync add({ db, dbTable, name, value }) {async function handleAdd(resolve) {const transaction = db.transaction([dbTable], 'readwrite');const objectStore = transaction.objectStore(dbTable);// written as key-value pairsconst updateRequest = objectStore.put(value, name);updateRequest.onsuccess = (event) => {console.log("Data set successfully", event);resolve(true);};updateRequest.onerror = (event) => {console.log("Data setting failed", event);resolve();};};return new Promise(resolve => handleAdd(resolve)).catch(err => {console.log("Data setting error", err);return false;});}// Data acquisition methodasync get({ db, dbTable, name }) {return new Promise(resolve => {const isExistTable = this.checkTable({ db, dbTable });// Determine whether storage space existsif (isExistTable) {// Exist, get and return the specified key valueconst transaction = db.transaction([dbTable], 'readonly');const objectStore = transaction.objectStore(dbTable);const getRequest = objectStore.get(name);getRequest.onsuccess = (event) => {console.log("Data obtained successfully", event);const data = event.target.result;resolve(data);};getRequest.onerror = (event) => {console.log("Data acquisition failed", event);resolve();};} else {resolve();}}).catch(err => {console.log("Data acquisition error", err);});}// add storageasync addDBTable({ dbTable, name, value }) {return new Promise((resolve, reject) => {this.version = this.version + 1;const indexedDB = this.openDB();indexedDB.onupgradeneeded = (event) => {console.log("add table indexedDB onupgradeneeded", event);const db = event.target.result;if (!db.objectStoreNames.contains(dbTable)) {db.createObjectStore(dbTable);}};indexedDB.onsuccess = async (event) => {console.log("add table indexedDB onsuccess", event);const db = event.target.result;this.version = db.version;const res = await this.add({ db, dbTable, name, value });db.close();resolve(res); };indexedDB.onerror = (event) => {console.log("add table indexedDB onerror", event);const db = event.target.result;this.version = db.version;reject();};}).catch(err => {console.log("add table indexedDB error", err);return false;});}// clear storageasync clearDBTable({ dbTable }) {return new Promise((resolve, reject) => {this.version = this.version + 1;const indexedDB = this.openDB();indexedDB.onupgradeneeded = (event) => {console.log("clear table indexedDB onupgradeneeded", event);const db = event.target.result;if (db.objectStoreNames.contains(dbTable)) {db.deleteObjectStore(dbTable);}};indexedDB.onsuccess = async (event) => {console.log("clear table indexedDB onsuccess", event);const db = event.target.result;this.version = db.version;db.close();resolve(true); };indexedDB.onerror = (event) => {console.log("clear table indexedDB onerror", event);const db = event.target.result;this.version = db.version;reject();};}).catch(err => {console.log("clear table indexedDB error", err);return false;});}// retrieve dataasync getItem(config) {return new Promise((resolve, reject) => {const { name,dbTable: incomingDBTable} = config || {};const indexedDB = this.openDB();indexedDB.onsuccess = async (event) => {console.log("get indexedDB onsuccess", event);const db = event.target.result;let dbTable = incomingDBTable;// Determine whether there is incoming storage spaceif (dbTable) {// Yes, data acquisition is performed directly in the incoming storage spaceconst res = await this.get({ db, dbTable, name });db.close();return resolve(res);}// None, get data in the default storage spacedbTable = this.dbTable;const res = await this.get({ db, dbTable, name });db.close();resolve(res);}indexedDB.onerror = (event) => {console.log("get indexedDB onerror", event);reject();}}).catch(err => {console.log("get indexedDB error", err);});}// Add/update dataasync setItem(config) {return new Promise((resolve, reject) => {const { name,value,dbTable: incomingDBTable} = config || {};const indexedDB = this.openDB();const dbTable = incomingDBTable || this.dbTable;indexedDB.onsuccess = async (event) => {console.log("set indexedDB onsuccess", event);const db = event.target.result;const isExistTable = this.checkTable({ db, dbTable });let res;// Determine whether the specified storage space existsif (isExistTable) {// There is a direct add or updateres = await this.add({ db, dbTable, name, value });db.close();} else {db.close();res = await this.addDBTable({ dbTable, name, value });}resolve(res);}indexedDB.onerror = (event) => {console.log("set indexedDB onerror", event);reject();}}).catch(err => {console.log("set indexedDB error", err);return false;});}// Clear the specified data in the specified storage space under the databaseasync removeItem(config) {return new Promise((resolve, reject) => {const { name,dbTable: incomingDBTable} = config || {};const indexedDB = this.openDB();const dbTable = incomingDBTable || this.dbTable;indexedDB.onsuccess = (event) => {console.log("remove indexedDB onsuccess", event);const db = event.target.result;const isExistTable = this.checkTable({ db, dbTable });// Determine whether the specified storage space existsif (isExistTable) {const deleteTransaction = db.transaction([dbTable], 'readwrite');const deleteObjectStore = deleteTransaction.objectStore(dbTable);const deleteRequest = deleteObjectStore.delete(name);deleteRequest.onsuccess = (event) => {console.log("Data removed successfully", event);db.close();resolve(true);};deleteRequest.onerror = (event) => {console.log("Data removal failed", event);db.close();resolve(false);};} else {db.close();resolve(true);}}indexedDB.onerror = (event) => {console.log("remove indexedDB onerror", event);reject();}}).catch(err => {console.log("remove indexedDB error", err);return false;});}// Clear all data in the specified storage space under the databaseasync clear(config) {return new Promise((resolve, reject) => {const { dbTable: incomingDBTable} = config || {};const indexedDB = this.openDB();const dbTable = incomingDBTable || this.dbTable;indexedDB.onsuccess = (event) => {console.log("clear indexedDB onsuccess", event);const db = event.target.result;const isExistTable = this.checkTable({ db, dbTable });if (isExistTable) {const transaction = db.transaction([dbTable], 'readwrite');const objectStore = transaction.objectStore(dbTable);const cursorRequest = objectStore.openCursor();cursorRequest.onsuccess = (event) => {let cursor = event.target.result;if (cursor) {cursor.delete();cursor.continue();}};cursorRequest.onerror = (event) => {console.log("Data clearing failed", event);db.close();resolve(false);};transaction.oncomplete = (event) => {console.log("Data cleared successfully", event);db.close();resolve(true);};transaction.onerror = (event) => {console.log("Data clearing transaction succeeded", event);db.close();resolve(false);};} else {db.close();resolve(true);}}indexedDB.onerror = (event) => {console.log("clear indexedDB onerror", event);reject();}}).catch(err => {console.log("clear indexedDB error", err);return false;});}// Clear the specified storage space under the databaseasync clearTableItem(config) {return new Promise((resolve, reject) => {const { dbTable: incomingDBTable} = config || {};const indexedDB = this.openDB();const dbTable = incomingDBTable || this.dbTable;indexedDB.onsuccess = async (event) => {console.log("clear table indexedDB onsuccess", event);const db = event.target.result;const isExistTable = this.checkTable({ db, dbTable });if (isExistTable) {db.close();const res = await this.clearDBTable({ dbTable });resolve(res);} else {db.close();resolve(true);}}indexedDB.onerror = (event) => {console.log("clear table indexedDB onerror", event);reject();}}).catch(err => {console.log("clear table indexedDB error", err);return false;});}
}export { CreateDB };
export { dbMap };export default {CreateDB,dbMap
};

2、内容说明

  • dbMap:用来记录存储数据库的名称,放在此处集中管理数据的名称;
  • defaultDBTable:每个数据库默认的存储空间(相当于默认表);
  • defaultVersion:每个数据库默认的版本(都是从1开始);
  • CreateDB:给予传入的数据库名称、存储空间,生成一个数据库的对象,用来操作该数据库。不传入,就都是用默认值;
  • initialization:在new一个数据库的实例是,会自动执行的初始化方法。主要是用来检查当下浏览器的数据库中是否存在构造的数据库,如果存在,则记录该数据库的当下版本,以便之后连接数据库时使用;
  • openDB:连接数据库;
  • getDBS:获取浏览器当下存在的数据库;
  • checkDB:检查浏览器是否存在构造的数据库;
  • checkTable:在构造的数据库中,检查是否存在指定的存储空间;
  • add:以键值对的形式添加数据;
  • get:通过键获取数据;
  • addDBTable:添加存储空间;
  • clearDBTable:移除某个存储空间;
  • getItem:用来获取数据(对外实际使用的数据操作方法);
  • setItem:添加或是更新数据(对外实际使用的数据操作方法);
  • removeItem:移除数据(对外实际使用的数据操作方法);
  • clear:移除某个存储空间下的所有数据(对外实际使用的数据操作方法);
  • clearTableItem:移除某个存储空间(对外实际使用的数据操作方法);

注意:都是异步方法;

3、使用

const currDB = new CreateDB();
// 或是:const currDB = new CreateDB({ dbName: dbMap.defaultDBName });// 获取
currDB.getItem({ name: "key" });
// 添加或更新
currDB.setItem({ name: "key", value: 123456 });
// 移除
currDB.removeItem({ name: "key" });
// 清除某个存储空间下的所有数据
currDB.clear({ dbTable: "dbTable" });
// 清除某个存储空间
currDB.clearTableItem({ dbTable: "dbTable" });

http://www.ppmy.cn/news/708678.html

相关文章

Linux-CentOS7版本的系统搭建达梦数据库

目录 VMware中安装CentOS 7.5并做相关的配置搭建Docker环境搭建达梦数据库拉取镜像查看镜像命令为镜像设置一个别名根据镜像 创建一个容器 根据镜像 创建一个容器启动并进入容器 VMware中安装CentOS 7.5并做相关的配置 使用VMware安装CentOS7的虚拟机可以参考另外一篇文章&…

SD卡电脑读不出来解决方法

解决方法&#xff1a;右键“计算机/我的电脑”管理&#xff0c;磁盘管理&#xff0c;发现是有这个这个内存卡的。只要出现这个就好说了&#xff0c;肯定能解决。分析发现磁盘&#xff08;内存卡&#xff09;没有盘符&#xff0c;随便设置一个F盘 步骤如下&#xff1a;

android买哪种内存卡好,该如何挑选适合自己的内存卡?

该如何挑选适合自己的内存卡&#xff1f; 虽然前面给大家测试了内存卡的相关传输速度和跑分情况&#xff0c;但是在电脑上的测试并不能反映和代表它在手机上运行和读取的实际数据。因为电脑和手机之间运行环境有很大的差异&#xff0c;再加上读卡器&#xff0c;数据线以及测试软…

uhs3内存卡有哪些_内存卡SD卡有哪些类型详细区别介绍

目前的sd内存卡分为比较慢速度的普通卡和稍微快一些的SDHC卡&#xff0c;和SD卡协会的新规格SDXC存储卡&#xff0c;其实现的容量超越32GB&#xff0c;最大可达2TB。 速度上sd卡分成了C2&#xff0c;C4&#xff0c;C6&#xff0c;C10卡&#xff0c;上面的数字就标示写入最大2M/…

第三十七章Java类的定义及定义类时可用的关键字

类是 Java 中的一种重要的引用数据类型&#xff0c;也是组成 Java 程序的基本要素&#xff0c;因为所有的 Java 程序都是基于类的。本节介绍如何定义类。 在 Java 中定义一个类&#xff0c;需要使用 class 关键字、一个自定义的类名和一对表示程序体的大括号。完整语法如下&…

引爆媒体关注的秘密武器:媒介易教你打造热门新闻故事!

在进行媒体邀约时&#xff0c;提供有吸引力的新闻价值和故事性是吸引媒体关注和获得采访机会的关键。媒体记者时常接收大量的邀约&#xff0c;因此需要与众多企业竞争&#xff0c;才能让自己的邀约脱颖而出。本文将探讨如何在媒体邀约中提供有吸引力的新闻价值和故事性&#xf…

Python3 学习(二)-Python的标准库

文章目录 Python的标准库内置函数模块sys模块os模块logging模块json模块 Python的标准库 内置函数 abs(x)返回一个数的绝对值。 参数可以是整数、浮点数或任何实现了 __abs__() 的对象。 如果参数是一个复数&#xff0c;则返回它的模。all(iterable)如果 iterable 的所有元素…

【Vue3】学习笔记-toRef

作用 创建一个ref对象&#xff0c;其value值指向另一个对象中的某个属性。 语法 const nametoRef(person,‘name’) 应用 要将响应式对象中的某个属性单独提供给外部使用时 #扩展 toRefs与toRef功能一直&#xff0c;但可以批量创建多个ref对象,语法&#xff1a;toRefs(per…