class DB{
/** 构造函数 */
constructor(dbName){
this.dbName = dbName;
}
/**
* 选择表单
*/
table(tableName, keys, version){
version = version || 1;
this.tableName = tableName;
this.request = indexedDB.open(this.dbName, version);
return new Promise((resolve, reject) => {
this.request.onsuccess = (event) => {
this.db = event.target.result;
resolve(this);
}
this.request.onupgradeneeded = (event) => {
this.db = event.target.result;
var objectStore;
// 排列组合组装索引
var groups = [];
for(let i=0; i< keys.length; i++){
var arr = [];
arr.push([keys[i]]);
for(let j=0; j< groups.length; j++){
arr.push([...groups[j], keys[i]]);
}
groups = groups.concat(arr);
}
if(!this.db.objectStoreNames.contains(tableName)){
objectStore = this.db.createObjectStore(tableName, {keyPath: 'id'});
groups.forEach(item => {
var idx = item.join('_');
objectStore.createIndex(idx, item, {unique: false});
});
}
else{
objectStore = this.request.transaction.objectStore(tableName);
var newIndexNames = [];
groups.forEach(item => {
var idx = item.join('_');
newIndexNames.push(idx);
if(!objectStore.indexNames.contains(idx)){
objectStore.createIndex(idx, item, {unique: false});
}
});
var delIndexNames = [];
for(var i=0; i<objectStore.indexNames.length; i++){
var item = objectStore.indexNames.item(i);
if(!newIndexNames.includes(item)){
delIndexNames.push(item);
}
}
// 删除索引
delIndexNames.forEach(item => {
console.log('del:' + item);
objectStore.deleteIndex(item);
});
}
}
this.request.onerror = (event) => {
reject(event);
}
});
}
/**
* 新增数据
*/
add(item){
return new Promise((resolve, reject) => {
var request = this.db.transaction([this.tableName], 'readwrite')
.objectStore(this.tableName)
.add(item);
request.onsuccess = (event) => {
resolve(event);
}
request.onerror = (event) => {
reject(event);
}
});
}
/**
* 通过ID获取
*/
get(id){
return new Promise((resolve, reject) => {
var transaction = this.db.transaction([this.tableName]);
var objectStore = transaction.objectStore(this.tableName);
var request = objectStore.get(id);
request.onsuccess = (event) => {
resolve(event.target.result);
}
request.onerror = (event) => {
reject(event);
}
});
}
/** 获取所有 */
findAll(){
return new Promise((resolve, reject) => {
var transaction = this.db.transaction([this.tableName]);
var objectStore = transaction.objectStore(this.tableName);
var items = [];
objectStore.openCursor().onsuccess = async (event) => {
var cursor = event.target.result;
if(cursor){
console.log(cursor);
items.push(cursor.value);
cursor.continue();
}
else{
resolve(items);
}
}
});
}
/**
* 查询列表
*/
findList(filter){
return new Promise((resolve, reject) => {
var keys = Object.keys(filter);
var values = Object.values(filter);
var transaction = this.db.transaction([this.tableName]);
var objectStore = transaction.objectStore(this.tableName);
var index = objectStore.index(keys.join('_'));
var items = [];
index.openCursor(IDBKeyRange.only(values)).onsuccess = async (event) => {
var cursor = event.target.result;
if(cursor){
items.push(cursor.value);
cursor.continue();
}
else{
resolve(items);
}
}
});
}
}
var db = new DB('TTD');
db.table('person', ['name', 'age'], 11)
.then(() => {
//return db.add({id: 6, name: '王五', age: 25, email: 'zhangsan@email.com'})
})
.then(()=>{
return db.get(11);
}).then(res => {
console.log(res);
}).then(() => {
return db.findAll();
}).then(res =>{
console.log(res);
}).then(() =>{
return db.findList({age: 25})
}).then(res =>{
console.log(res);
});