最近遇到一个项目需要存储大量的数据,对比了一下各种存储,indexDB是最符合要求的,其特点就不列出来了,还是直接上代码吧。。indexDB的增删改查基本涵盖了,查询有根据主键查询,自己另外设置了索引,所以有相应的索引查询,然后另外写了一个模糊查询。有错误欢迎指正~
本文参考了阮一峰老师的indexDB的入门教程
let myDB = {
name: 'myDB',
version: 1,
db: null,
ojstore: {
name: 'list',//存储空间表的名字
keypath: 'id',//主键
indexName: 'name',//索引名称
}
};
let IndexDB = {
indexedDB: window.indexedDB || window.webkitindexedDB,
IDBKeyRange: window.IDBKeyRange || window.webkitIDBKeyRange,//键范围
openDB: function (dbname, dbversion, callback) {
//建立或打开数据库,建立对象存储空间(ObjectStore)
let self = this;
let version = dbversion || 1;
let request = self.indexedDB.open(dbname, version);
request.onerror = function (e) {
console.log(e.currentTarget.error.message);
};
request.onsuccess = function (e) {
myDB.db = e.target.result;
console.log('成功建立并打开数据库:' + myDB.name + ' version' + dbversion);
};
request.onupgradeneeded = function (e) {
let db = e.target.result, transaction = e.target.transaction, store;
if (!db.objectStoreNames.contains(myDB.ojstore.name)) {
//没有该对象空间时创建该对象空间
store = db.createObjectStore(myDB.ojstore.name, {keyPath: myDB.ojstore.keypath});
console.log('成功建立对象存储空间:' + myDB.ojstore.name);
store.createIndex(myDB.ojstore.indexName, myDB.ojstore.indexName, {unique: false});
}
}
},
deleteDB: function (dbname) {
//删除数据库
let self = this;
self.indexedDB.deleteDatabase(dbname);
console.log(dbname + '数据库已删除')
},
closeDB: function (db) {
//关闭数据库
db.close();
console.log('数据库已关闭')
},
addData: function (db, storename, data) {
//添加数据,重复添加会报错
let store = store = db.transaction(storename, 'readwrite').objectStore(storename), request;
for (let i = 0; i < data.length; i++) {
request = store.add(data[i]);
request.onerror = function () {
console.error('add添加数据库中已有该数据')
};
request.onsuccess = function () {
console.log('add添加数据已存入数据库')
};
}
},
putData: function (db, storename, data) {
//添加数据,重复添加会更新原有数据
let store = store = db.transaction(storename, 'readwrite').objectStore(storename), request;
for (let i = 0; i < data.length; i++) {
request = store.put(data[i]);
request.onerror = function () {
console.error('put添加数据库中已有该数据')
};
request.onsuccess = function () {
console.log('put添加数据已存入数据库')
};
}
},
getDataByKey: function (db, storename, key) {
//根据存储空间的键找到对应数据
let keyData;
let store = db.transaction(storename, 'readwrite').objectStore(storename);
let request = store.get(key);
request.onerror = function () {
console.error('getDataByKey error');
};
request.onsuccess = function (e) {
keyData = e.target.result;
console.log('查找数据成功')
};
return keyData;
},
getDataByIndex: function (db, storename, indexName) {
//根据索引找到对应数据
let keyData;
let store = db.transaction(storename, 'readwrite').objectStore(storename);
let request = store.index(myDB.ojstore.indexName).get(indexName);
request.onerror = function () {
console.error('getDataByIndex error');
};
request.onsuccess = function (e) {
keyData = e.target.result;
console.log('根据索引查找数据成功')
console.log(keyData);
};
},
getAllData: function (db, storename) {
//获取全部数据
let all = []
let store = db.transaction(storename, 'readwrite').objectStore(storename);
let request = store.openCursor();
request.onerror = function () {
console.error('getDataByKey error');
};
request.onsuccess = function (e) {
let result = e.target.result;
if (result) {
// console.log(result.value);
all.push(result.value);
result.continue();
} else {
console.log('已获取全部数据!')
}
};
},
getSearchData: function (db, storename, condition) {
//根据条件获取数据(模糊查询)
let all = []
let store = db.transaction(storename, 'readwrite').objectStore(storename);
let request = store.openCursor();
request.onerror = function () {
console.error('getDataByKey error');
};
request.onsuccess = function (e) {
let result = e.target.result;
if (result) {
if (JSON.stringify(result.value).indexOf(condition) > 0) {
all.push(result.value);
}
result.continue();
} else {
console.log('根据条件已获取全部数据!')
console.log(all);
}
};
},
deleteData: function (db, storename, key) {
//删除某一条记录
let store = store = db.transaction(storename, 'readwrite').objectStore(storename);
store.delete(key)
console.log('已删除存储空间' + storename + '中' + key + '记录');
},
clearData: function (db, storename) {
//删除存储空间全部记录
let store = db.transaction(storename, 'readwrite').objectStore(storename);
store.clear();
console.log('已删除存储空间' + storename + '全部记录');
}
}
let list = [{name:'test1',age:'12'},
{name:'test2',age:'13'},
{name:'test3',age:'14'}];
IndexDB.openDB(myDB.name, myDB.version);
setTimeout(function () {
IndexDB.addData(myDB.db, myDB.ojstore.name, list);//添加数据
// IndexDB.addData(myDB.db, myDB.ojstore.name, list);//add重复添加
// IndexDB.putData(myDB.db, myDB.ojstore.name, list);//put重复添加
// IndexDB.getDataByKey(myDB.db, myDB.ojstore.name, 'test1');//根据主键获取数据
// IndexDB.getAllData(myDB.db, myDB.ojstore.name);//获取所有数据
// IndexDB.getDataByIndex(myDB.db, myDB.ojstore.name,'test');//模糊查询数据
// IndexDB.deleteData(myDB.db,myDB.ojstore.name,'test1');//根据主键删除数据
// IndexDB.clearData(myDB.db,myDB.ojstore.name);//删除全部数据
// IndexDB.closeDB(myDB.db);//关闭数据库
// IndexDB.deleteDB(myDB.name);//删除数据库
}, 800);