//初始数据库结构
|
const dbData = [
|
{
|
dbName: "masterDB", //数据库名称
|
version: 1, //数据库版本号,当结构发生变化时
|
tables: [ //表
|
{
|
name: "SYS_favorites", //表名称
|
keyPath: "uid", //主键
|
autoIncrement: false, //主键是否自增
|
index: [ //索引
|
{
|
name: "name_index", //索引名称
|
key: "name" //索引key
|
}
|
]
|
},
|
{
|
name: "SYS_keyword",
|
keyPath: "id"
|
}
|
]
|
},
|
{
|
dbName: "guestDB",
|
version: 1,
|
tables: [
|
{
|
name: "MY_demo",
|
keyPath: "id"
|
}
|
]
|
}
|
]
|
|
// 使用示例
|
// import DB from '@/utils/db'
|
|
// 初始化创建数据库 一般在项目启动时就执行了
|
// await DB.create()
|
|
// 打开某个数据库,返回数据库实例
|
// const database = await DB.open("dbName")
|
|
// 在打开的数据库中添加数据到tablenName表
|
// await database.add("tablenName", data)
|
|
// 查询
|
// await database.get("tablenName", key)
|
|
// 查询 根据索引
|
// await database.indexGet("tablenName", "indexName", indexVal)
|
|
// 修改
|
// await database.put("tablenName", data)
|
|
// 删除
|
// await database.delete("tablenName", key)
|
|
// 获取所有
|
// await database.getAll("tablenName")
|
|
// 清空某个表数据
|
// await database.clear("tablenName")
|
|
// 获取某个表信息
|
// database.getTable("tablenName")
|
|
// 获取所有表
|
// database.getTables()
|
|
// 关闭数据库连接
|
// database.close()
|
|
|
export default {
|
//建立数据库,表,初始数据
|
create() {
|
var promiseArray = []
|
const addDB = db => {
|
return new Promise((resolve, reject) => {
|
const request = indexedDB.open(db.dbName, db.version)
|
request.onupgradeneeded = e => {
|
const thisDB = e.target.result
|
db.tables.forEach(item => {
|
let table = null
|
if (thisDB.objectStoreNames.contains(item.name)) {
|
//已存在表,删除旧index
|
table = e.target.transaction.objectStore(item.name)
|
table.indexNames.length>0 && table.indexNames.forEach(indexName => {
|
table.deleteIndex(indexName)
|
})
|
}else{
|
//创建新的表
|
table = thisDB.createObjectStore(item.name, {
|
keyPath: item.keyPath,
|
autoIncrement: item.autoIncrement
|
})
|
}
|
//建立index
|
item.index && item.index.forEach(ind => {
|
table.createIndex(ind.name, ind.key, { unique: false })
|
})
|
})
|
},
|
request.onsuccess = e => {
|
return resolve(e.target.result)
|
}
|
request.onerror = e => {
|
return reject(e)
|
}
|
})
|
}
|
dbData.forEach(db => {
|
promiseArray.push(addDB(db))
|
})
|
return new Promise((resolve, reject) => {
|
Promise.all(promiseArray).then((e) => {
|
resolve(e)
|
}).catch(e => {
|
reject(e)
|
})
|
})
|
},
|
//所有数据库
|
databases(){
|
return indexedDB.databases()
|
},
|
//打开数据库
|
open(dbName){
|
return new Promise((resolve, reject) => {
|
const request = indexedDB.open(dbName)
|
request.onsuccess = e => {
|
const database = new this.database(e.target.result)
|
resolve(database)
|
}
|
request.onerror = e => {
|
reject(e)
|
}
|
})
|
},
|
//删除数据库
|
deleteDB(dbName){
|
return indexedDB.deleteDatabase(dbName)
|
},
|
//数据库类
|
database: function (IDBDatabase) {
|
this.IDBDatabase = IDBDatabase
|
|
/**
|
* 添加行数据
|
* @param {string} tableName 表名
|
* @param {object} data 数据
|
* @returns {promise}
|
*/
|
this.add = (tableName, data) => {
|
return new Promise((resolve, reject) => {
|
const request = IDBDatabase.transaction([tableName], 'readwrite').objectStore(tableName).add(data)
|
request.onsuccess = e => {
|
resolve(e)
|
}
|
request.onerror = e => {
|
reject(e)
|
}
|
})
|
}
|
|
/**
|
* 修改行数据,未查询到就新增
|
* @param {string} tableName 表名
|
* @param {object} data 数据
|
* @returns {promise}
|
*/
|
this.put = (tableName, data) => {
|
return new Promise((resolve, reject) => {
|
const request = IDBDatabase.transaction([tableName], 'readwrite').objectStore(tableName).put(data)
|
request.onsuccess = e => {
|
resolve(e)
|
}
|
request.onerror = e => {
|
reject(e)
|
}
|
})
|
}
|
|
/**
|
* 删除行
|
* @param {string} tableName 表名
|
* @param {string} key 主键
|
* @returns {promise}
|
*/
|
this.delete = (tableName, key) => {
|
return new Promise((resolve, reject) => {
|
const request = IDBDatabase.transaction([tableName], 'readwrite').objectStore(tableName).delete(key)
|
request.onsuccess = e => {
|
resolve(e)
|
}
|
request.onerror = e => {
|
reject(e)
|
}
|
})
|
}
|
|
/**
|
* 根据主键获取行
|
* @param {string} tableName 表名
|
* @param {string} key 主键
|
* @returns {promise}
|
*/
|
this.get = (tableName, key) => {
|
return new Promise((resolve, reject) => {
|
const request = IDBDatabase.transaction([tableName], 'readwrite').objectStore(tableName).get(key)
|
request.onsuccess = () => {
|
resolve(request.result || null)
|
}
|
request.onerror = e => {
|
reject(e)
|
}
|
})
|
}
|
|
/**
|
* 根据索引获取行
|
* @param {string} tableName 表名
|
* @param {string} indexName 索引库名称
|
* @param {string} indexVal 索引值
|
* @returns {promise}
|
*/
|
this.indexGet = (tableName, indexName, indexVal) => {
|
return new Promise((resolve, reject) => {
|
const request = IDBDatabase.transaction([tableName], 'readwrite').objectStore(tableName).index(indexName).get(indexVal)
|
request.onsuccess = () => {
|
resolve(request.result || null)
|
}
|
request.onerror = e => {
|
reject(e)
|
}
|
})
|
}
|
|
/**
|
* 获取所有行
|
* @param {string} tableName 表名
|
* @returns {promise}
|
*/
|
this.getAll = (tableName) => {
|
return new Promise((resolve, reject) => {
|
const request = IDBDatabase.transaction([tableName], 'readwrite').objectStore(tableName).getAll()
|
request.onsuccess = () => {
|
resolve(request.result || null)
|
}
|
request.onerror = e => {
|
reject(e)
|
}
|
})
|
}
|
|
/**
|
* 清空表
|
* @param {string} tableName 表名
|
* @returns {promise}
|
*/
|
this.clear = (tableName) => {
|
return new Promise((resolve, reject) => {
|
const request = IDBDatabase.transaction([tableName], 'readwrite').objectStore(tableName).clear()
|
request.onsuccess = e => {
|
resolve(e)
|
}
|
request.onerror = err => {
|
reject(err)
|
}
|
})
|
}
|
|
/**
|
* 获取表信息
|
* @returns {IDBObjectStore}
|
*/
|
this.getTable = (tableName) => {
|
const request = IDBDatabase.transaction([tableName], 'readwrite').objectStore(tableName)
|
return request
|
}
|
|
/**
|
* 获取所有的表
|
* @returns {[IDBObjectStore]}
|
*/
|
this.getTables = () => {
|
const tables = []
|
for (let item of IDBDatabase.objectStoreNames) {
|
tables.push(IDBDatabase.transaction([item], 'readwrite').objectStore(item))
|
}
|
return tables
|
}
|
|
/**
|
* 关闭数据库连接
|
* @returns {}
|
*/
|
this.close = () => {
|
return IDBDatabase.close()
|
}
|
}
|
}
|