简单实用浏览器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

相关文章

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu2289(简单二分)

虽说是简单二分,但是我还是wa死了  题意:已知圆台的体积,求高度 首先要知道圆台体积怎么求:设上下底的半径分别为r1,r2,高为h,V = PI*(r1*r1+r1*r2+r2*r2)*h/3 然后以h进行二分 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#includ

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

uva 10387 Billiard(简单几何)

题意是一个球从矩形的中点出发,告诉你小球与矩形两条边的碰撞次数与小球回到原点的时间,求小球出发时的角度和小球的速度。 简单的几何问题,小球每与竖边碰撞一次,向右扩展一个相同的矩形;每与横边碰撞一次,向上扩展一个相同的矩形。 可以发现,扩展矩形的路径和在当前矩形中的每一段路径相同,当小球回到出发点时,一条直线的路径刚好经过最后一个扩展矩形的中心点。 最后扩展的路径和横边竖边恰好组成一个直

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu

uva 10130 简单背包

题意: 背包和 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <queue>#include <map>

zeroclipboard 粘贴板的应用示例, 兼容 Chrome、IE等多浏览器

zeroclipboard单个复制按钮和多个复制按钮的实现方法 最近网站改版想让复制代码功能在多个浏览器上都可以实现,最近看网上不少说我们的代码复制功能不好用的,我们最近将会增加代码高亮等功能,希望大家多多支持我们 zeroclipboard是一个跨浏览器的库类 它利用 Flash 进行复制,所以只要浏览器装有 Flash 就可以运行,而且比 IE 的

JAVA用最简单的方法来构建一个高可用的服务端,提升系统可用性

一、什么是提升系统的高可用性 JAVA服务端,顾名思义就是23体验网为用户提供服务的。停工时间,就是不能向用户提供服务的时间。高可用,就是系统具有高度可用性,尽量减少停工时间。如何用最简单的方法来搭建一个高效率可用的服务端JAVA呢? 停工的原因一般有: 服务器故障。例如服务器宕机,服务器网络出现问题,机房或者机架出现问题等;访问量急剧上升,导致服务器压力过大导致访问量急剧上升的原因;时间和

简单的角色响应鼠标而移动

actor类 //处理移动距离,核心是找到角色坐标在世界坐标的向量的投影(x,y,z),然后在世界坐标中合成,此CC是在地面行走,所以Y轴投影始终置为0; using UnityEngine; using System.Collections; public class actor : MonoBehaviour { public float speed=0.1f; CharacterCo

微软正式推出 Spartan 斯巴达浏览器

作为用于替代 IE 浏览器的下一代继任者,微软的 Project Spartan 斯巴达浏览器可算是吊足了玩家们的胃口!如今,在最新的 Windows 10 Build 10049 版本起,它终于正式登场了。 斯巴达浏览器搭载了全新的渲染引擎、新的用户界面并集成了 Cortana 语音助手。功能上新增了稍后阅读列表、阅读视图、F12开发者工具、支持网页注释 (手写涂鸦),可以保存到 O