前端数据库:IndexedDB 基础使用

前言

在现代 Web 开发中,随着应用程序复杂度的增加,对本地存储的需求也越来越高。虽然 localStorage 和 sessionStorage 可以满足一些简单的数据存储需求,但当需要存储大量结构化数据或进行复杂查询时,它们就显得力不从心了。这时候,IndexedDB 就成为了一个强大的选择。本文将带你全面了解 IndexedDB 的使用,从基础操作到高级技巧,助你在项目中灵活应用。



1. IndexedDB 是什么?为啥要用它?

首先,IndexedDB 是浏览器内置的一个 NoSQL 数据库。它和传统的关系型数据库不同,更像是一个键值对存储,但功能更强大。它的特点可以用几个关键词来概括:

  • 大容量:通常可以存储几百 MB 甚至 GB 级别的数据,非常适合需要离线存储的应用。
  • 异步操作:所有操作都是非阻塞的,不会让页面卡顿。
  • 复杂查询:支持索引和游标,可以高效地查询和遍历数据。
  • 事务支持:可以确保数据的完整性和一致性。

举个简单的例子,如果你在开发一个需要用户离线使用的笔记应用,或者一个需要存储大量用户数据的复杂表单,IndexedDB 绝对是你的好帮手!



2. indexedDB 数据库的使用

2.1. 查看indexedDB

indexDB 其实是 window 对象的一个属性。 也就是全局变量。 因此我们可以在控制台直接输出

在这里插入图片描述

在这里插入图片描述

通过在控制台中输出 indexDB 对象,我们可以一目了然地看到它所提供的各种方法。


2.2. 打开和创建数据库

首先要掌握的就是它的核心方法之一 的open()open() 方法用于打开或创建一个数据库,并返回一个 IDBOpenDBRequest 对象,这个对象代表了异步操作的请求。通过IDBOpenDBRequest ,我们可以监听数据库的打开状态,并进一步执行后续操作。

在这里插入图片描述

在这里插入图片描述


Open() 参数

让我们来详细了解一下 open() 方法的两个参数:

  1. 第一个参数(必传):数据库名称。用于指定你要打开或创建的数据库的名称。
  2. 第二个参数(可选):数据库版本号。不传默认值为 1。

在我们成功创建数据库后,可以通过浏览器的开发者工具中 Application 面板直观地看到数据库的名称以及当前版本号

在这里插入图片描述

当你需要升级数据库结构(例如新增或修改对象存储空间)时,可以通过指定一个更高的版本号来触发 upgradeneeded 事件,进而完成数据库的更新操作。

这两个参数为 open() 方法提供了灵活性,既确保了操作的明确性,也为数据库的版本管理提供了支持。📚


Open() 返回值

open() 方法会返回一个 IDBOpenDBRequest 对象,这是因为 IndexedDB 中的所有操作(包括打开、读取、编辑和删除) ,都是异步执行的。由于这些操作可能需要一定的时间才能完成,无法立即返回结果,因此 IDBOpenDBRequest 对象提供了一系列事件绑定机制,方便我们在操作的不同阶段(如成功、失败或数据库需要升级时)进行相应的处理。通过监听这些事件,开发者可以更灵活地控制数据库操作的流程和响应。

在这里插入图片描述

在 IndexedDB 中,版本号是一个重要的机制,用于管理数据库的更新和变更。当我们尝试打开一个数据库时,系统会检查当前是否存在该数据库:

如果数据库不存在,IndexedDB 会自动创建一个新的数据库,并将其版本号初始化为 1。

如果数据库已存在,则会根据传入的版本号与当前保存的版本号进行比较:

  • 如果传入的版本号比当前版本更高,IndexedDB 会触发upgradeneeded事件,此时开发者可以在事件回调中执行数据库的更新操作(例如创建、修改或删除对象存储表)。
  • 传入的版本号不能低于当前版本号,因为 IndexedDB 的版本号是单向递增的,不允许回退到旧版本。

注意,这里的版本号是一个整数。如果你传入一个float,那么将会对该float进行取整操作。


2.3. 创建一个对象存储表

当创建一个新的数据库或对现有数据库进行版本升级时,IndexedDB 会触发一个 onupgradeneeded 事件。在该事件中,通过访问 event.target.result,我们可以获取到 IDBDatabase 实例。借助这个实例,开发者可以执行诸如创建、修改或删除对象存储表等数据库升级操作,从而完成数据库结构的更新。

其基本使用方式如下所示:

在这里插入图片描述

创建成功后,就可以在控制台中查看到创建的存储空间

在这里插入图片描述


createObjectStore 参数

  1. name:第一个参数, 表示储存表的名称
  2. keyOptions: 第二个参数(可选参数), 是配置对象,
  • keyPath: 储存数据的标识符
  • autoIncrement:默认为false,若为true,则会自动在储存的对象上添加标识符属性,并附上一个自增的正数值(1,2,3,4…)

3. IndexedDB 核心操作

3.1. 开启事务获取存储对象

indexedDB的所有操作都需要在事务中,我们看一个开启事务的操作:

在这里插入图片描述


在 IndexedDB 中,`transaction` 方法用于创建一个事务对象,以便对指定的存储对象进行操作。`transaction`方法接收两个参数:
  1. 第一个参数是一个数组,数组中包含此事务将会处理的存储对象名称;
  2. 第二个参数是事务的处理模式,比如 readonlyreadwrite,分别表示只读和读写模式。

一旦事务创建成功,我们可以监听事务的 completeerror 事件,以处理事务完成或出错的情况。接下来,我们可以通过事务对象对指定的 myObjectStore 执行操作


在操作数据之前,咱们得先通过事务调用 objectStore 方法,拿到要操作的存储对象。这个方法会返回一个 IDBDatabase 类型的存储对象实例。有了这个实例,咱们就可以调用它的各种方法来操作数据了。

在这里插入图片描述

通过输出的存储对象实例,我们可以直接查看其提供的各种操作方法,从而通过这些方法操作存储数据。

在这里插入图片描述


3.2. 添加数据

获取到存储对象后, 就可以调用它提供的 add 方法来新增数据。

添加数据示例:
在这里插入图片描述

数据添加成功后,你可以去查看数据表里的内容。这时候你会发现,数据里多了一个 id 属性,这就是这条数据的唯一标识符。这是因为前面咱们设置了自动生成 id 的功能。如果没设置的话,那就得手动给数据添加一个 id 属性了。但要注意,id 的值必须唯一,不能和其他数据重复,不然添加就会失败。

在这里插入图片描述


3.3. 更新数据

要更新数据,可以使用put()方法。使用 put 方法更新数据时,如果数据不存在则会添加。

在这里插入图片描述


3.4. 查询数据

通过 get 方法或游标查询数据。调用get方法需要传入主键id

在这里插入图片描述


3.5. 删除数据

通过delete方法删除单个条目或者clear 方法删除整个对象。

使用 delete 方法删除数据时, 需要传入主键, 根据主键删除。

在这里插入图片描述



总结

本文全面介绍了 IndexedDB 的核心概念和使用方法,包括数据库的创建与升级、对象存储表的构建、数据的增删改查以及事务管理。通过详细的代码示例和清晰的步骤说明,读者可以快速上手并灵活应用 IndexedDB,满足复杂 Web 应用对本地存储的需求。无论是离线应用开发还是大容量数据管理,IndexedDB 都能成为你的得力助手。

如果觉得本文对你有帮助,希望能够给我点赞支持一下哦 💪 也可以关注wx公众号:程序员付杰 ,一起学习编程技能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/92824.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/92824.shtml

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

相关文章

Kubernetes深度解析:企业级容器编排平台的核心实践

引言:Kubernetes的战略地位与核心价值在云原生技术生态中,​​Kubernetes​​已成为容器编排的事实标准。根据2023年全球云原生调查报告:全球​​96%​​ 的组织正在使用或评估Kubernetes企业生产环境Kubernetes采用率增长​​400%​​&#…

Netty中future和promise用法和区别

定义与概念 Future:表示一个异步操作的结果。它是只读的,意味着你只能查看操作是否完成、是否成功、获取结果或者异常等信息,但不能主动设置操作的结果。Promise:是 Future 的可写扩展。它不仅可以像 Future 一样查看操作结果&…

微算法科技(NASDAQ:MLGO)采用分布式哈希表优化区块链索引结构,提高区块链检索效率

随着区块链技术的快速发展,其在各个领域的应用越来越广泛。然而,区块链数据的存储和检索效率问题一直是制约其发展的瓶颈之一。为了解决这一问题,微算法科技(NASDAQ:MLGO)采用了分布式哈希表(DHT)技术来优化…

Jmeter的元件使用介绍:(三)配置元件详解01

Jmeter的配置元件有非常多,常用的有:信息头管理器、Cookie管理器、用户定义的变量、Http请求默认值、JDBC Connection Configuration、CSV 数据文件设置、计数器等,本文会对这些常用的配置元件一一介绍,还有其他很多配置元件&…

git 连接GitHub仓库

一、安装 git 包在官网下载 git 包二、通过SSH密钥与GitHub远程仓库连接1. 检查本地 SSH 密钥是否存在ls -al ~/.ssh如果看到 id_rsa 和 id_rsa.pub,说明已有密钥。2.如果没有,生成新的 SSH 密钥:ssh-keygen -t ed25519 -C "your_email…

如何通过AI扫描代码中的问题

代码质量其实在需求高压,业务快速迭代的场景下往往容易被人忽视的问题,大家的编码习惯和规范也经常会各有喜好,短期之内获取看不出来什么问题,但长此以往就会发现,屎山逐步成型了,而线上代码跑着往往就不想…

Java 大视界 -- Java 大数据机器学习模型在金融衍生品市场波动特征挖掘与交易策略创新中的应用(363)

Java 大视界 -- Java 大数据机器学习模型在金融衍生品市场波动特征挖掘与交易策略创新中的应用(363)引言:正文:一、Java 构建的金融数据处理架构1.1 多源异构数据实时融合1.2 新闻舆情与市场冲击建模二、Java 驱动的波动特征挖掘与…

Cartographer安装测试与模块开发(三)--Cartographer在Gazebo仿真环境下的建图以及建图与定位阶段问题(实车也可参考)

参数介绍之所以要首先介绍参数而不是实操,是因为大部分建图失败、漂移基本上都是参数设置错误引起的,或者说大部分都是TF存在问题,主要是坐标系Frame之间有冲突或者对不上等原因导致的,因此把参数放在前面介绍,了解了参…

uniapp nvue开发App 横竖屏切换丢失上下文导致 setTimeout和clearTimeout报错

报错内容如下 [JS Framework] Failed to find taskCenter (35). [JS Framework] Failed to execute the callback function:TypeError: c.clearTimeout is not a function reportJSException >>>> exception function:__WEEX_CALL_JAVASCRIPT__, exception:JavaSc…

Mirauge3D 赋能:全自动建模,让城市规划与建筑设计拥有高分辨率实景三维模型

在数字化浪潮席卷各行各业的当下,高精度、多元化的空间数据已成为基础测绘、智慧城市建设、自然资源管理等领域高质量发展的核心支撑。从城市交通网络的智能规划到国土空间的优化配置,从灾害监测的精准预警到生态环境保护的科学决策,空间数据…

Javaweb————学习javaweb的预备知识

❤️❤️❤️一.javase,javaweb,javaee的区别和联系 💙💙💙javase: 通俗的来讲就是java技术栈,做java相关开发的基础,比如javaweb,javaee开发都是必备javase的基础的,包括java语言基础&#xff…

zabbix服务自动发现、自动注册及配置钉钉告警(小白的“升级打怪”成长之路)

目录 一、自动发现及自动注册 1、自动发现 2、自动注册规则 二、监控告警并发送电子邮件 1、设定发邮件的地址 2、设定发邮件的用户 3、设定监控及触发的条件 4、开始告警并设置触发发邮件 三、钉钉告警 1、配置zabbix-server 2、配置监控及触发 3、web页面操作 4、…

OSPF多区域

OSPF多区域划分的必要性 OSPF单区域存在的问题 LSDB 庞大,占用内存大,SPF计算开销大。 LSA洪泛范围大,拓扑变化影响范围大。 路由不能被汇总,路由表庞大,查找路由开销大 解决办法 划分区域可以解决上述问题 每个区域独…

质数、因数、最大公约数经典问题整理

1、计数质数 MX 5000000 is_prime [1] * MX is_prime[0] is_prime[1] 0 for i in range(2, MX):if is_prime[i]:for j in range(i * i, MX, i):is_prime[j] 0class Solution:def countPrimes(self, n: int) -> int:return sum(is_prime[:n]) 2、序列中不同最大公约数的…

Java NIO FileChannel在大文件传输中的性能优化实践指南

Java NIO FileChannel在大文件传输中的性能优化实践指南 在现代分布式系统中,海量数据的存储与传输成为常见需求。Java NIO引入的FileChannel提供了高效的文件读写能力,尤其适合大文件传输场景。本文从原理深度解析出发,结合生产环境实战经验…

SQLite Insert 语句详解

SQLite Insert 语句详解 SQLite 是一种轻量级的数据库管理系统,它以其简洁的设计、强大的功能和易于使用而闻名。在 SQLite 中,INSERT 语句用于向数据库表中添加新数据。本文将详细介绍 SQLite 的 INSERT 语句,包括其基本语法、使用方法以及一些高级特性。 基本语法 SQLi…

git更新内核补丁完整指南

Git操作完整指南 📋 目录 项目概述 Git基础配置 日常操作流程 补丁更新操作 分支管理 冲突解决 常见问题 最佳实践 命令速查表 🎯 项目概述 </

关于回归决策树CART生成算法中的最优化算法详解

首先&#xff0c;一共比如有M个特征&#xff0c;N个样本&#xff0c;对于每一个特征j&#xff0c;遍历其中的N个样本&#xff0c;得到N个值中&#xff0c;最小的值&#xff0c;作为这个特征的最优切分点&#xff0c;而其中的c1&#xff0c;c2是可以直接得到的。然后&#xff0c…

Ubuntu 环境下创建并启动一个 MediaMTX 的 systemd 服务

文章目录一、简介二、安装及使用三、创建系统服务小结一、简介 MediaMTX 是一个现代、高性能、跨平台的 流媒体服务器&#xff0c;主要用于接收、转发、转码和分发 音视频流&#xff0c;支持多种协议。它的前身是 rtsp-simple-server&#xff0c;后来重命名为 MediaMTX&#x…

在React中,函数式组件和类组件各有优缺点

函数式组件&#xff1a;无this&#xff0c;无生命周期&#xff0c;配合使用useEffect&#xff0c; 可使用Hooks。 类组件&#xff1a;有生命周期&#xff0c;状态管理&#xff0c;无Hooks&#xff0c;适用于需要明确生命周期方法和实例方法的场景。 函数式组件 优点&#xff1a…