class DB {
db// 数据库对象
dbName// 数据库名
table// 表对象
tableName// 表名
constructor(dbName) {
this.dbName = dbName
}
// 打开indexDB
// 打开/创建数据库
initDB = (dbName) => {
return new Promise((resolve,reject) => {
const name = dbName || this.dbName
if(!name) return reject('请指定要打开的数据库名')
const request = window.indexedDB.open(name)
request.onerror = () => {
this.dbName = undefined
console.error(name+'数据库打开失败')
reject(false)
}
request.onsuccess = (res) => {
this.dbName = name
this.db = res.target.result
console.log(name+'数据库打开成功')
resolve(true)
}
request.onupgradeneeded = (res) => {
this.db = res.target.result
console.log(name+'数据库打开或更新成功')
resolve(true)
}
})
}
// 初始化表
createObjectStore = (tableName,obj,indexObj) => {
if(!this.db) {
console.error('请先打开(initDB)数据库')
return
}
if(!tableName || typeof tableName !== 'string') return
this.tableName = tableName
if (!this.db.objectStoreNames.contains(tableName)) {
// 建表
this.table= this.db.createObjectStore(tableName, obj);
if(indexObj) this.createIndex(indexObj)
}
}
// 添加表字段传入表对象
createIndex = (obj) => {
if(!this.table) {
console.error('请先创建(createObjectStore)仓库对象')
return
}
Object.keys(obj).forEach(key => {
this.table.createIndex(key, key, { unique: obj[key].unique });
})
}
// 添加数据
addData(params, tableName) {
const name = tableName || this.tableName
return new Promise((resolve, reject) => {
const transaction = this.db.transaction(
name,
"readwrite"
);
const store = transaction.objectStore(name);
const response = store.add(params);
response.onsuccess = (event) => {
resolve(event);
};
response.onerror = (event) => {
reject(event);
};
});
}
// 编辑数据
updateData(params, tableName) {
const name = tableName || this.tableName
return new Promise((resolve, reject) => {
const transaction = this.db.transaction(
name,
"readwrite"
);
const store = transaction.objectStore(name);
const response = store.put(params);
response.onsuccess = (event) => {
resolve(event);
};
response.onerror = (event) => {
reject(event);
};
});
}
// 删除数据
removeData(key, tableName) {
const name = tableName || this.tableName
const transaction = this.db.transaction(name,'readwrite')
const store = transaction.objectStore(name)
const response = store.delete(key)
response.onsuccess = () => {
console.error('数据删除成功')
}
}
// 清空数据
clearData(tableName) {
const name = tableName || this.tableName
const transaction = this.db.transaction(name,'readwrite')
const store = transaction.objectStore(name)
const response = store.clear()
response.onsuccess = () => {
console.error('清空数据成功')
}
response.onerror = () => {
console.error('清空数据失败')
}
}
// 通过主键查询数据
getDataByKey(tableName, key) {
const name = tableName || this.tableName
return new Promise((resolve, reject) => {
const transaction = this.db.transaction(name);
const objectStore = transaction.objectStore(name);
// 通过主键读取数据
// const request = objectStore.get(key);
// getAll(key)同get(key)获取指定key对应数据,如果getAll不传参或者传null即返回所有数据
const request = objectStore.getAll(key);
request.onsuccess = () => {
resolve(request.result);
};
request.onerror = (event) => {
reject(event);
};
});
}
// 关闭数据库
closeDB() {
this.db.close()
}
}
indexDB操作
最新推荐文章于 2024-06-26 17:12:42 发布