【前端笔记】indexDB使用简单介绍

news/2025/2/3 18:19:27/

什么是indexDB?

IndexedDB 是一种底层 API,用于在客户端存储大量的结构化数据(也包括文件/二进制大型对象(blobs))。该 API 使用索引实现对数据的高性能搜索。虽然 Web Storage 在存储较少量的数据很有用,但对于存储更大量的结构化数据来说力不从心。而 IndexedDB 提供了这种场景的解决方案。本页面 MDN IndexedDB 的主要引导页 - 这里,我们提供了完整的 API 参考和使用指南,浏览器支持细节,以及关键概念的一些解释的链接。——MDN

为什么要使用indexDB?

其实在前面的MDN对indexDB的介绍中已经说明了,虽然 Web Storage 在存储较少量的数据很有用,但对于存储更大量的结构化数据来说力不从心。而 IndexedDB 提供了这种场景的解决方案。简而言之,indexDB就是为特殊场景下需要客户端缓存更多的数据,并实现更高性能搜索数据的一种方式。属于是storage的plus++版本

IndexDB的兼容性如何?

作为前端开发,在使用任何一种新属性或API时,主动查看兼容性感觉已经是被动技能了(虽然在2023年的今天,对兼容性的要求已经不再像以前那么强了

indexDB兼容性概览
可以看到,在2023年的今天,indexDB的兼容性已经很不错了。所以这还不快快学起来

IndexDB的使用

  • 1、创建并打开一个数据库
  • 2、添加数据库数据
  • 3、删除数据库数据
  • 4、更新数据库数据
  • 5、获取数据库数据

创建并打开一个数据库

let db;
const request = window.indexDB.open(name, version);request.onsuccess = e => {db = e.target.result;console.log('数据库打开成功会执行');
};request.onupgradeneeded = e => {console.log('数据库创建和更新会执行');
};request.onerror = error => {console.log('数据库打开失败会执行');
};// onupgradeneeded回调会比onsuccess先触发

可以看到打开一个数据库需要2个参数,第一个参数name是数据库的名称,第二个参数version是数据库的版本(version只能传入整数,不能传入浮点数,否则它将会被转变成离它最近的整数,这可能导致 upgradeneeded 事件不会被触发)

执行完毕后可以在控制台的Application中找到该数据库,如下图

在这里插入图片描述

添加数据库数据

const data = {id: Date.now(),name: '张三',age: 18,
};
// 因为db是在回调中赋值,使用定时器为了保证db能正常访问,不知道为什么可以去了解事件循环
setTimeout(() => {// 1、创建事务const transaction = db.transaction([storeName], 'readwrite');// 2、访问对象仓库const store = transaction.objectStore(storeName);// 3、向仓库添加数据store.add(data);store.onsuccess = e => {console.log('数据添加成功后触发');};transaction.oncomplete = e => {console.log('所有数据添加完毕后触发');};transaction.onerror = error => {console.log('数据添加失败后触发');};
}, 1500);

在indexDB中想要操作数据库,就必须开启一个事务(transaction)事务来源于数据库对象。

开启一个事务需要2个参数:

  • storeNames:作用域,想要访问的对象仓库数组。可以传控数组但没必要
  • 事务模式readonly或者readwrite

该方法返回一个可以访问对象仓库的事务对象,使用该对象就可以操作对象仓库。

添加数据成功后,可以如下图所示刷新数据库
在这里插入图片描述
在这里插入图片描述

删除数据库数据

indexDB中删除数据有2种方式,因为创建对象仓库时也有2种配置。删除就是根据创建对象仓库时定义的方式找到相应的数据进行删除

1、创建对象仓库

indexDB中,onupgradeneeded是我们唯一可以修改数据库结构的地方。在这里面,我们可以创建和删除对象存储空间以及构建和删除索引。

onupgradeneeded就是创建/更新数据库的回调。很好理解,使用数据库一共就3个回调:onsuccess onerroronupgradeneeded。我们不可能在失败和成功才进行数据库的一些设置,所以只有在onupgradeneeded时对数据库进行一些配置,如下:

// 自动忽略剩下代码,只关注主要部分
let objectStore;
request.onupgradeneeded = e => {// 建立对象仓库来存储数据// 1、根据数据的某个字段作为键路径,要求后续数据必须有该字段objectStore = db.createObjectStore('yourStoreName', { keyPath: 'id' });// 2、使用键生成器,自动生成数据主键(键生成器默认不开启)objectStore = db.createObjectStore('yourStoreName', { autoIncrement: true });
};

自定义keyPath

在这里插入图片描述

键生成器生成主键Key

在这里插入图片描述

2、删除数据

// 1、创建事务
const transaction = db.transaction([storeName], 'readwrite');
// 2、访问对象仓库
const store = transaction.objectStore(storeName);
// 3、根据keyPath或主键删除数据
store.delete(keyPath/key);

注:使用keyPath进行删除时,传入的keyPath一定要全等于(===)对象仓库的key,否则会删除不成功。比如我想删除上图自定义keyPath图中key为1688275751079的数据,从图上能明显看到key为number,如果我写成delete('1688275751079')执行后将会没有反应

更新数据库数据

// 1、创建事务
const transaction = db.transaction([storeName], 'readwrite');
// 2、访问对象仓库
const store = transaction.objectStore(storeName);
// 3、根据keyPath或主键修改数据,如果不存在keyPath/key,则新增该数据
store.put(newData);

例如:

// 根据keyPath修改数据
const newData = {id: 1,name: 'abc',age: 23
};
store.put(newData); // newData中需要有一个对应到对象仓库数据的key,才能找到对应数据并修改// 根据键生成器自动生成的主键更新数据
store.put(newData, key); // 第一个参数为新数据,第二个参数为对应到对象仓库数据的主键

获取数据库数据

const transaction = db.transaction([storeName], 'readwrite');
// 2、访问对象仓库
const store = transaction.objectStore(storeName);
// 3、根据keyPath或主键获取数据
const res = store.get(keyPath/key);
console.log(res.result);

资料参考:https://developer.mozilla.org/zh-CN/docs/Web/API/IndexedDB_API


http://www.ppmy.cn/news/701191.html

相关文章

JavaScript设计模式策略模式案例分享

前言 策略设计模式就是指一个问题匹配多个解决方法,不一定要用到哪一个,而且有可能随时增加多个方案 比如我们去买书,书店都会搞一些优惠活动,满100减20,满200减50,八折优惠这些,但是优惠活动…

期刊学术论文格式

1 、题名 中文题名一般不超过20个汉字,必要时可加副题名。文章应附英文题名。2 、作者及其工作单位 中国作者姓名的汉语拼音采用如下写法:姓前名后,中间为空格。姓氏的全部字母均大写,复姓应连写。名字的首字母大写&#…

数据库作业13反馈

数据库 作业13 题目要求 13、综合练习(一) 简介 1、创建数据库MyLib,保存于E盘根目录下以自己学号姓第一个字母(阿拉伯数字大写字母)方式创建的文件夹中,初始大小5MB,最大200MB,…

英文参考文献的著录规范

在日常的科研生活中,不免会阅读大量的文献,同时在撰写科研论文的时候也会去参考、引用,那么该如何标准地引用英文参考文献,今天一起来学习一下) 英文参考文献的著录规范 参考文献格式的种类英文参考文献在中文期刊中的…

Linux中编写Shell脚本

目录 Shell Shell脚本的执行 Shell脚本编写规范 Shell 中的变量 变量的算术运算 双小括号 (()) 数值运算命令的用法 let 运算命令的用法 expr 命令的用法 br 命令的用法 $[] 符号的运算示例 Shell脚本的条件测试 几种条件测试语句 文件测试操作符 字符串测试操作…

【MapReduce】程序打成jar包上传集群运行

文章目录 一、生成jar包① 通过maven自动生成② 手动打jar包 二、集群运行_路径问题① 内置路径② 参数形式输入路径 一、生成jar包 ① 通过maven自动生成 直接找到maven工具,点击package即可~ ② 手动打jar包 找到project structure -> artifacts -> -&g…

参考文献中英文人名_参考文献中英文人名的缩写规则 (2)

. . 参考文献中英文人名的缩写规则 参考文献是科技论文的重要组成部分, 也是编辑加工和重要内容。 温哥华格式要求, 著 录文后参考文献时, 英文刊名和人名一律用缩写。 这一规则也是众多检索系统在人名著录时 的首选规则。 下面我们先看一个例子: 在文章发表时, 由于西方人…

【护照】关于护照必须要知道的知识【出国必看,护照的正确使用】

护照知识 什么是护照? 护照是一个国家的公民出入本国国境和到国外旅行或居留时, 由本国发给的一种证明该公民国籍和身份的合法证件。 护照一词在英文中是口岸通行证的意思。也就是说, 护照是公民旅行通过各国国际 口岸的一种通行证明。所以, 世界上…