前端数据存储方式之indexedDB

本文详细介绍了前端存储方式中的IndexedDB,包括其特点:键值对存储、异步操作、支持事务、同源策略和大容量存储等。文章详细讲解了如何连接与创建数据库、创建对象仓库、进行事务操作,以及新增、更新、获取和删除数据的方法。此外,还阐述了游标的使用,帮助开发者更好地掌握IndexedDB的实战应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

前端从发展到现在已经形成了一定的浏览器存储数据的方式,有cookiesessionStoragelocalStorageindexedDB以及被废弃的web sql.
特点:

  • 键值对存储 每一条数据有一个主键,主键独一无二,实行key-value进行存储。
  • 异步操作 实行异步操作。
  • 支持事务 支持事务操作意味着数据操作只有成功和失败两种状态。
  • 同源策略 每一个数据库对应创建它的域名,只能访问自身域名下的数据库。
  • 存储空间大 支持大于250M的数据,甚至没有上限
  • 支持二进制存储 可以存储二进制数据。

数据库操作

数据库连接与创建数据库

使用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()进行对象仓库的创建。

  • 第一个参数是仓库名称,同一个数据库中不可以重复。
  • 第二个参数是一个对象,包含keyPathautoIncrement,分别表示每条记录的键名和是否使用自动递增的整数作为键名,默认为false
db.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支持事务操作,事务就是说在对数据库的操作只有成功和失败这两种可能,所以说在进行数据库的操作之前需要先创建事务。

  • name是要操作的仓库的名称
  • readwrite是对仓库进行什么操作
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunqy1995

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值