前端从发展到现在已经形成了一定的浏览器存储数据的方式,有cookie
、sessionStorage
、localStorage
、indexedDB
以及被废弃的web sql
.
特点:
key-value
进行存储。使用window对象indexedDB属性的open()方法,其中第一个参数是数据库名称,如果存在就打开数据库不存在就创建。第二个参数是数据库的版本是大于0的正整数。
数据库打开时,会触发4中事件:
success: 打开成功。
error: 打开失败
upgradeneeded: 第一次打开该数据库,或者数据库版本发生变化时触发。
blocked: 上一次的数据库连接还未关闭
注意:第一次打开数据库时,会先触发upgradeneeded
事件,然后触发success
事件。
let request = indexedDB.open(name, 1);
request.onsuccess = function(e){
db = e.target.result;
}
使用createObjectStore()
进行对象仓库的创建。
keyPath
和autoIncrement
,分别表示每条记录的键名和是否使用自动递增的整数作为键名,默认为falsedb.createObjectStore(name[,options]);
//一般创建仓库都在upgradeneeded事件中
request.addEventListener('upgradeneeded', e => {
db = e.target.result;
if(!db.objectStoreNames.contains('person')){
let store = db.createObjectStore(table, {keyPath: 'keyword', autoIncrement: false});
}
})
indexedDB支持事务操作,事务
就是说在对数据库的操作只有成功和失败这两种可能,所以说在进行数据库的操作之前需要先创建事务。
const tx = db.transaction(name, 'readwrite');
indexedDB数据库也可以进行添加数据的操作,需要先添加事务,使用add
进行添加,但是如果是相同的就会操作失败。还可以使用链式调用,indexedDB操作时异步操作,所以需要进行监听事件监听成功和失败。
const tx = db.transaction('name', 'readwrite');
const store = tx.objectStore('name');
const add = store.add({keyword:'table',s:0});
add.addEventListener('success', e => {
console.log('操作成功');
})
add.addEventListener('error', e => {
console.log('操作失败');
})
如果想添加相同的数据可以使用put
方法
const tx = db.transaction('name', 'readwrite');
const store = tx.objectStore('name');
const add = store.put({keyword:'table',s:0});
add.addEventListener('success', e => {
console.log('操作成功');
})
add.addEventListener('error', e => {
console.log('操作失败');
})
使用get
方法,通过key值获得该值。
const get = db.transaction('name','readwrite')
.objectStore('name')
.get('keyword');
使用delete
方法,通过key值进行删除
const get = db.transaction('name','readwrite')
.objectStore('name')
.delete('keyword');
indexedDB有一种游标操作,从仓库的第一条开始一直遍历到最后一条,使用openCursor
创建,使用continue
,result就是仓库中的所有数据。
const cursor = db.transaction('users').objectStore('users').openCursor();
cursor.addEventListener('success',e=>{
let result = e.target.result;
if(result){
console.log('cursor',result);
cursor.continue();//可以将地址指针指向下一个地址。
}else{
console.log('遍历完成',result);
}
})
相关代码详见 https://github.com/youyou1995/learn/blob/master/javascript/indexedDB/indexedDB.js