IndexedDB封装及问题处理
1. 封装
基于单例模式进行indexedDB的封装(源码在最后),包括CURD操作。
基本知识可先学习浏览器数据库 IndexedDB 入门教程
2. 问题及处理
遇到问题如下:
1. 场景: 我在创建数据库及对象仓库(类似于数据库表)后马上去操作数据库(CURD)
错误信息: indexedDB.js:156 add data failed DOMException: Failed to execute 'transaction' on 'IDBDatabase': A version change transaction is running。
原因: 创建数据库的流程是 open -> onupgradeneeded(版本升级时调用) -> onsuccess, 遇到此错误是因为试图在版本更改事务仍在运行时启动第二个事务。 我在onupgradeneeded和onsuccess中都返回了db对象,在onupgradeneeded中返回的db其实还处于open的事务中时,我又通过另外一个transaction 去获取数据库的数据,导致现在出现同时两个事务在操作数据库。
查看打印日志如下:
修改: 只在onsuccess中返回db实例,确保每次都是在打开数据库成功的情况下去操作数据库。
代码:
async connectDB(dbName, version, callback = (() => { })) {
return new Promise((resolve, reject) => {
let request = this.indexedDB.open(dbName, version)
request.onerror = (err) => {
console.error('open indexedDB failed', err)
// VER_ERR 表明存储在磁盘上的数据库的版本高于你试图打开的版本
this.db = null
reject