简单实用浏览器indexDB

2024-05-10 18:32

本文主要是介绍简单实用浏览器indexDB,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

之前在做项目的过程中,偶有用到indexDB来做缓存,后面就基本上使用的localstrage,恩,其实indexDB也是挺好使用的,可以去看看张鑫旭的这几篇文章

https://www.zhangxinxu.com/wordpress/2018/06/js-localforage-localstorage-indexdb/

https://www.zhangxinxu.com/wordpress/2017/07/html5-indexeddb-js-example/

写得也都很全面,下面附上自写的部分代码

class UtilDB {constructor(store, ...options) {this.store = store;this.options = options;}/*** 打开创建数据库 返回promise* @param {DB名字} name* @param {版本号} version*/openDB(name, version = 1, keypath) {let indexDB =window.indexedDB ||window.mozIndexedDB ||window.webkitIndexedDB ||window.msIndexedDB;let request = indexDB.open(name, version);const pormise = new Promise((resolve, reject) => {request.onerror = e => {console.log("连接indexDB数据库失败");console.error(e.currentTarget.error.message);reject(e.currentTarget.error.message);};request.onsuccess = e => {console.log("连接indexDB数据库成功");this.db = e.target.result;resolve(this.db);};request.onupgradeneeded = e => {let db = e.target.result;if (!db.objectStoreNames.contains(this.store)) {let store = db.createObjectStore(this.store, {keypath: keypath,autoIncrement: true});this.options.forEach(item => {if (Object.prototype.toString.call({}) == "[object Object]") {store.createIndex(item.name + "", item.name + "", item.options);} else {store.createIndex(item + "", item + "", {unique: false});}});}};});return pormise;}/*** 创建事务* @param {事务} way*/__commonCrud(way) {let normal = this.store + "";let tx = this.db.transaction(normal, way);let store = tx.objectStore(normal);return store;}/*** 添加数据* @param {一般为string类型} val 要添加的值* @param {Function} callback 回调函数*/addData(val, callback = () => {}) {let req = this.__commonCrud("readwrite");req = req.add(val);req.onsuccess = e => {console.info("addData", "添加数据成功");return callback(e.target);};req.onerror = e => {console.error("add Error", "添加数据失败");return callback(e.target);};}/*** 修改操作* @param {*} val 要修改的值* @param {*} callback 修改的回调*/putData(val, callback = () => {}) {let req = this.__commonCrud("readwrite");req = req.put(val, val[Object.keys(val)[0]]);req.onsuccess = e => {console.log("修改数据成功");return callback(e.target);};req.onerror = e => {console.log("修改数据失败");return callback(e.target);};}/*** 获取数据* @param {key} val key值,一般为string* @param {*} callback 获取数据的回调函数*/getData(val, callback = () => {}) {let req = this.__commonCrud("readonly");req = req.get(val);req.onsuccess = e => {if ("success" === e.type) {console.log("获取数据成功");return callback(e.target.result);}};req.onerror = e => {console.log("获取数据失败");return callback(e);};}/*** 获取所有数据* @param {*} callback*/getAllData(callback = () => {}) {let req = this.__commonCrud("readwrite");let result = [];req = req.openCursor();req.onerror = e => {console.error("query error", e.error);return callback(e.target);};req.onsuccess = e => {let cursor = e.target.result;if (cursor) {result.push(cursor.value);cursor.continue();} else {return callback(result);}};}/*** 获取单条数据* @param {*} name* @param {*} callback*/getSignleData(name, callback = () => {}) {console.log("获取单条信息");let req = this.__commonCrud("readonly");let index = req.index(this.options[0].name);req = index.get(name);req.onsuccess = e => {console.log("获取单条数据成功");return callback(e.target.result);};req.onerror = e => {console.log("获取单条数据成功");return callback(e.target.result);};}/*** 删除数据* @param {*} val* @param {*} callback*/deleteData(val, callback = () => {}) {let req = this.__commonCrud("readwrite");req = req.delete(val);req.onerror = e => {console.log("系统错误");return callback(e.target);};req.onsuccess = e => {console.log("执行成功");return callback(e.target);};}/*** 删除单条数据* @param {*} userName* @param {*} callback*/deleteSignleData(userName, callback = () => {}) {let req = this.__commonCrud("readwrite");req = req.openCursor();req.onerror = e => {console.error("query:error", "查询使用游标时出错");return callback(e.error.name);};req.onsuccess = e => {let cursor = e.target.result;if (cursor) {if (cursor.userName == userName) {cursor.delete();}cursor.continue();} else {return callback(cursor);}};}onError(callback) {return callback(event);}onSuccess(callback) {return callback(event);}onComplete(callback) {return callback(event);}/*** 关闭数据库* @param {数据库} db*/closeDB(db) {db.close();}/*** 删除数据库* @param {数据库名称} name*/deleteDB(name) {indexedDB.deleteDatabase(name);}
}
export default UtilDB;

其他更多文章,请移步www.yuduo.top

这篇关于简单实用浏览器indexDB的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机

linux重启命令有哪些? 7个实用的Linux系统重启命令汇总

《linux重启命令有哪些?7个实用的Linux系统重启命令汇总》Linux系统提供了多种重启命令,常用的包括shutdown-r、reboot、init6等,不同命令适用于不同场景,本文将详细... 在管理和维护 linux 服务器时,完成系统更新、故障排查或日常维护后,重启系统往往是必不可少的步骤。本文

如何在Mac上彻底删除Edge账户? 手动卸载Edge浏览器并清理残留文件技巧

《如何在Mac上彻底删除Edge账户?手动卸载Edge浏览器并清理残留文件技巧》Mac上的Edge账户里存了不少网站密码和个人信息,结果同事一不小心打开了,简直尴尬到爆炸,想要卸载edge浏览器并清... 如果你遇到 Microsoft Edge 浏览器运行迟缓、频繁崩溃或网页加载异常等问题,可以尝试多种方

Python如何将OpenCV摄像头视频流通过浏览器播放

《Python如何将OpenCV摄像头视频流通过浏览器播放》:本文主要介绍Python如何将OpenCV摄像头视频流通过浏览器播放的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完... 目录方法1:使用Flask + MJPEG流实现代码使用方法优点缺点方法2:使用WebSocket传输视

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

C/C++ chrono简单使用场景示例详解

《C/C++chrono简单使用场景示例详解》:本文主要介绍C/C++chrono简单使用场景示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录chrono使用场景举例1 输出格式化字符串chrono使用场景China编程举例1 输出格式化字符串示

MySQL 添加索引5种方式示例详解(实用sql代码)

《MySQL添加索引5种方式示例详解(实用sql代码)》在MySQL数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中,下面给大家分享MySQL添加索引5种方式示例详解(实用sql代码),... 在mysql数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中。索引可以在创建表时定义,也可

如何关闭Mac的Safari通知? 3招教你关闭Safari浏览器网站通知的技巧

《如何关闭Mac的Safari通知?3招教你关闭Safari浏览器网站通知的技巧》当我们在使用Mac电脑专注做一件事情的时候,总是会被一些消息推送通知所打扰,这时候,我们就希望关闭这些烦人的Mac通... Safari 浏览器的「通知」功能本意是为了方便用户及时获取最新资讯,但很容易被一些网站滥用,导致我们

JDK9到JDK21中值得掌握的29个实用特性分享

《JDK9到JDK21中值得掌握的29个实用特性分享》Java的演进节奏从JDK9开始显著加快,每半年一个新版本的发布节奏为Java带来了大量的新特性,本文整理了29个JDK9到JDK21中值得掌握的... 目录JDK 9 模块化与API增强1. 集合工厂方法:一行代码创建不可变集合2. 私有接口方法:接口

windows和Linux安装Jmeter与简单使用方式

《windows和Linux安装Jmeter与简单使用方式》:本文主要介绍windows和Linux安装Jmeter与简单使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows和linux安装Jmeter与简单使用一、下载安装包二、JDK安装1.windows设