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

news2024/11/16 19:49:24

什么是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.coloradmin.cn/o/711098.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:如何用Python计算圆面积

如何用Python计算圆面积 介绍 圆是几何学中基本的图形之一,圆面积的计算是数学中的基础知识。使用Python编程语言可以快速、简便地计算圆的面积。本文将介绍如何使用Python编写圆面积计算器,并演示计算圆面积的步骤。无需高深的数学知识,只…

IPv6地址分类

一. 前言 IPv6地址分为单播地址,组播地址和任播地址。它们的地址详细分类和地址的范围如下图所示。 二. IPv6地址分类 1. 全球单播地址 类似于IPv4的公网地址,由前缀,子网ID和接口标识组成。 2. 链路本地地址 只能在连接到同一个本地链路的节…

《空指针》Optional解决链式调用NPE问题

Optional解决链式调用NPE问题 1.map() public class Main {public static void main(String[] args) {Person person new Person();Info personInfo new Info();int result;// 1.PersonInfo 为空person.setPersonInfo(null);result Optional.ofNullable(person).map(Person…

cpp-httplib

安装 cpp-httplib gitee链接: https://gitee.com/yuanfeng1897/cpp-httplib?_fromgitee_searchv0.7.15版本链接: https://gitee.com/yuanfeng1897/cpp-httplib/tree/v0.7.15把httplib.h拷贝到我们的项目中即可 接入cpp-httplib:header-only&#xff…

Kubernetes 1.27 版本基于(haproxy+keepalived)部署高可用集群

Kubernetes 1.27 版本基于(haproxykeepalived)部署高可用集群 二、系统架构2.1 架构基本需求2.2 架构图 三、环境准备3.1 云服务或虚拟机清单3.2 升级操作系统内核3.3 设置hostname3.4 修改hosts文件映射(注意替换你的规划每一台机器的IP&…

泛型深入~

1:泛型的概述的优势 2:泛型的好处 2:自定义泛型类 2:泛型类的原理 把出现泛型变量的地方全部替换成传输的真实数据类型 3:自定义泛型方法 4:自定义泛型接口 5:泛型通配符,上下限

03-1_Qt 5.9 C++开发指南_Qt核心特点(元对象系统特性:属性系统;信号与槽机制、动态类型转换;元对象特性测试实例)

Qt 是一个用标准 C编写的跨平台开发类库,它对标准 C进行了扩展,引入了元对象系统信号与槽、属性等特性,使应用程序的开发变得更高效。本章将介绍 Qt 的这些核心特点,对于理解和编写高效的 Ot C程序是大有帮助的;还介绍…

Servlet 项目创建和部署

目录 创建步骤: 1.创建项目 ​编辑2. 引入依赖 3.创建目录,复制内容 4.编写代码 5.打包 6.部署 7.验证 简化: 常见报错情况: 1.端口占用 2.路径错误 3.405 4.500 服务器代码抛出异常 5.依赖没下载好 创建步骤: 1.…

标注一致性计算

在统计学中,标注一致性(Inter-annotation agreement, IAA)用于评价独立观察者之间对同一现象进行评估时的一致程度。因此,本文讨论最多的是多位标注员对相同数据进行标注时的一致性评估方法。 一、Kappa统计量 评估一致性最简单…

Mysql高级篇(面试必看)

Mysql高级篇知识点,全篇手打,大家觉得有用的话点一个赞,持续更新 目录 1.Mysql锁的机制:粒度分类,思想分类,实现分类,状态分类,算法分类 2.Mysql的隔离级别:读未提交&…

视觉SLAM学习路线思维导图

整理了一下视觉SLAM学习路线的思维导图,防遗忘,不足的地方也希望各路大神能够不吝赐教。

Nginx(2)静态资源部署

静态资源 静态资源的配置指令静态资源优化配置静态资源压缩Gzip模块配置指令Gzip压缩功能的实例Gzip和sendfile共存问题gzip_static测试使用 静态资源的缓存处理浏览器缓存相关指令 Nginx的跨域问题解决静态资源防盗链防盗链的实现原理防盗链的具体实现 上网搜索访问资源是通过…

Java15——枚举类、注解、作业

1. 枚举类 跳了很多。。。 2. 注解 3. 作业 1. 注意:所有类共享静态属性 所以结果是 9,red 100,red package com.zsq.homework1;public class HM1 {public static void main(String[] args) {Cellphone cellphone new Cellphone();cel…

Java面试题大全(23年整理版)最新全面技巧讲解

程序员面试背八股,可以说是现在互联网开发岗招聘不可逆的形式了,其中最卷的当属 Java!(网上动不动就是成千上百道的面试题总结)你要是都能啃下来,平时技术不是太差的话,面试基本上问题就不会太大…

如何在 MATLAB 中进行图像分割(matlab仿真与图像处理系列第7期)

在 MATLAB 中进行图像分割有多种方法,下面介绍一些常用的方法: 基于阈值的二值化分割这是一种最简单的分割方法,将图像分为两个部分:背景和前景。其主要思想是,选择一个阈值,将图像中的像素值与阈值进行比较,将像素值大于阈值的像素标记为前景(白色),将像素值小于阈值…

自动化测试练手项目推荐

最近收到许多自学自动化测试的小伙伴私信,学习了理论知识后,却没有合适的练手项目。 测试本身是一个技术岗位,如果只知道理论,没有实战经验,在面试中很难说服面试官,比如什么场景下需要添加显示等待&#x…

小白用旧手机搭建web服务器(一):实现局域网访问

1、首先要拥有一部安卓手机 2、下载ksweb 我们需要下载ksweb这款app,这是一位俄罗斯大神制作的,里面集成了Lighttpd、nginx、Apache的服务器,还有mysql服务器等,十分强大。 下载地址:KSWEB_3-93_kill_无ad.apk - 蓝…

大数据技术生态体系

6 大数据技术生态体系 图中涉及的技术名词解释如下: 1)Sqoop:Sqoop 是一款开源的工具,主要用于在 Hadoop、Hive 与传统的数据库(MySQL)间进行数据的传递,可以将一个关系型数据库(例如 :MySQL,Oracle 等)中的数据导进到 Hadoop 的 HDFS 中,也可以将 HDFS 的数据导进…

GPIO复用功能1——定时器输入捕获

文章目录 前言定时器输入捕获红外接收的数据分析捕获思路编程实践1.初始化时钟2.初始化GPIO3.配置定时器的时钟基准4.配置输入捕获参数5.中断配置6.中断服务函数7.处理数据帧 实现效果 总结 前言 前面介绍了GPIO的通用输入输出功能,以及其模拟时序的功能&#xff0c…

软件模拟实现SPI通信-GD32

软件模拟实现SPI通信-GD32 设计流程 #ifndef _SOFT_SPI_H #define _SOFT_SPI_H /** filename: soft_spi.h**/ #include "gd32f10x.h" #include "systick.h"//定义表示具体IO口的资源宏 #define SPI_PORT GPIOA #define SPI_MOSI GPIO_PIN_7 #define SP…