/** IndexedDB 使用示例 (以下为个人封装版, 具体内容下方有注释) // @params: 第一个参数: db名, 第二个参数: 表名, 第三个参数(注意了): 类似于数据库的主键key initDB('db', 'mytable', 'url') // 初始化 // @params: 第三个参数要存的值 setVal('db', 'mytable', {url: 222, data: {a: 11111}}) // 存数据 // @params: 第三个参数是主键key对的值, 根据这个值, 拿到之前存过的值 getVal('db', 'mytable', 222, (e) => { console.log(e) }) // 取数据 返回: {url: 222, data: {…}} 注:初始化成功后,控制台的Application内能看到。 新db注册后, 要关闭控制台, 重开一遍, 才能在控制台的Application内看见 */export const initDB = function (dbName, tableName, key) { // 初始化db const IndexedDB = window.indexedDB.open(dbName) IndexedDB.onupgradeneeded = function (event) { // 如果指定的版本号,大于数据库的实际版本号,就会发生数据库升级事件upgradeneeded // 新建数据库 const result = event.target.result; if (!result.objectStoreNames.contains(tableName)) { // 先判断库是否存在 result.createObjectStore(tableName, { keyPath: key }) // 表的主键 是 url 比如{url: 'xx', data: {xx}} 主键会自动生成索引 .createIndex(key, key, { unique: true }) // 建立索引 } IndexedDB.result.close() }}export const setVal = function (dbName, tableName, setData) { try { const IndexedDB1 = window.indexedDB.open(dbName) IndexedDB1.onsuccess = function (event) { const db = IndexedDB1.result; db.transaction([tableName], 'readwrite') // 指定需要访问的 数据库名 .objectStore(tableName) // 返回数据库对象 .put(setData) db.close() } } catch (error) { console.error(error) }}export const getVal = function (dbName, tableName, key, cb) { const IndexedDB2 = window.indexedDB.open(dbName) IndexedDB2.onsuccess = function (event) { const db = IndexedDB2.result; if (db.objectStoreNames.contains(tableName)) { const request = db.transaction([tableName], 'readwrite') .objectStore(tableName) .get(key) // key是: JSON.stringify(opt) request.onsuccess = function (event) { if (request.result) { cb(request.result) return true } else { throw 'indexDB 获取失败, key是: ' + key } } } db.close() }}