由于项目用到了indexedDB存一些数据,就补了一下这方便的资料。踩一下“坑”。若是你还不了解什么是indexedDB,能够先看看这三篇文章入个门。javascript
indexedDB 中 createObjectStore
(相似新增表)和deleteObjectStore
(相似删除表)方法只有在onupgradeneeded 中调用。而表有时候又是动态的,因此作了一下的封装。html
/** * 根据数据库中是否包含表名会自动升级数据库 * @param dbName 数据库名称 * @param storeNames 表名-arrays * @param version 数据库版本号 */ export async function openDatabase(dbName, storeNames = [], version = undefined) { return new Promise((resolve, reject) => { const request = window.indexedDB.open(dbName, version) request.onsuccess = (event) => { const db = event.target.result let isNeedUpdate = false for (let i = 0; i < storeNames.length; i++) { if (!db.objectStoreNames.contains(storeNames[i])) { isNeedUpdate = true break } } function callback(db) { if (db) { resolve(db) } else { reject(`can't open ${dbName}`) } } if (isNeedUpdate) { const version = db.version + 1 db.close() openDatabase(dbName, storeNames, version).then((db) => { callback(db) }) } else { callback(db) } } request.onerror = (e) => { reject(e) } request.onblocked = () => { reject(`${dbName} is blocked.`) } request.onupgradeneeded = (event) => { const db = event.target.result for (const storeName of storeNames) { if (!db.objectStoreNames.contains(storeName)) { db.createObjectStore(storeName, { keyPath: "key" // autoIncrement: true }) } } } }) }
个人需求是把一个文件列表存入数据库。以前是把文件完整路径做为了主键。可是当遇到修改文件名或移动文件,文件路径就会发生变动的这种状况,就须要更新主键。然而并无找到这样的方法。前端
IDBObjectStore.put(item, key)
方法用于更新某个主键对应的数据记录,若是对应的键值不存在,则插入一条新的记录。该方法返回一个 IDBRequest 对象。
该方法接受两个参数,第一个参数为新数据,第二个参数为主键,该参数可选,且只在自动递增时才有必要提供,由于那时主键不包含在数据值里面。
因此,我能想到的方案html5