IndexDB完整使用指南

news2025/2/1 22:50:28

IndexDB完整使用指南

数据存储是大多数 Web 应用程序的重要组成部分,从跟踪用户数据到应用程序数据。随着更快、更强大的 Web 应用程序的快速开发,需要高效的客户端存储来帮助开发。

多年来,Web 上的客户端存储已经发生了很大的变化,从用于存储用户数据的 cookieWebSQL(目前已弃用)的出现,它允许开发人员将数据存储在浏览器中的 SQL 数据库中,进而允许熟悉 SQL 的开发轻松构建健壮的应用程序。

IndexedDBWebSQL的替代品,提供比以前更多的存储容量。在本文中,我们将探讨如何使用和设置 IndexedDB 进行 Web端的数据存储,以及如何使用 API 操作其数据。

什么是IndexDB

IndexedDB 是用于客户端存储的一种成熟的、持久的 NoSQL 存储系统,可在浏览器中使用,允许存储不同类型的数据,例如:

  • 文件或 Blob
  • 图片和视频
  • 结构化数据,如对象、列表和数组

IndexedDB 可用于各种场景,例如缓存、PWA、游戏等,并且还支持事务。它的开发是为了有效地满足 Web 应用程序的多种需求。

IndexDB的使用

为了更好的展示IndexDB的使用,我们将创建一个基本的 TODO 网页 。

开发一个添加功能以学习如何将数据保存到数据库,另一个功能用于查看所有代办数据,以及一个删除功能。也就是增删改查。

首先我们先创建一个简单的html基础结构。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>TODO APP</title>
    <script src="index.js" defer></script>
    <style>
    .add, .view {
      padding: 30px;
      width: 40%;
    }
    .add {
      background: #ebe6e6; 
    }
    section {
      padding: 10px;
      background: #3182d4;
      display: flex;
      flex-direction: row;
      flex-wrap: wrap;
      justify-content: center;
    }
    h1 {
      margin: 0;
    }
    ol {
      list-style-type: none;
    }
    div {
      margin-bottom: 10px;
    }
    </style>
  </head>
  <body>
    <section>
      <aside class="view">
        <h2>TODOs</h2>
        <div class="todos">
          <ol></ol>
        </div>
      </aside>
      <aside class="add">
        <h2>添加 Todo</h2>
        <form>
          <div>
            <label for="title">标题:</label>
            <input id="title" type="text" required />
          </div>
          <div>
            <label for="desc">描述</label>
            <input id="desc" type="text" required />
          </div>
          <div>
            <button>保存</button>
          </div>
        </form>
      </aside>
    </section>
  </body>
</html>

通过script标签引入核心功能。

创建数据库

首先,我们需要创建数据库;然后,我们可以通过创建一个对象存储(类似于 SQL 中的表)来初始化它,我们将使用它来存储每个项目的详细信息。

let db;

const openOrCreateDB = window.indexedDB.open('todo_db', 1);
openOrCreateDB.addEventListener('error', () =>
  console.error('打开 IndexDB 失败')
);

openOrCreateDB.addEventListener('success', () => {
  console.log('打开 IndexDB 成功');
  db = openOrCreateDB.result;
});

openOrCreateDB.addEventListener('upgradeneeded', (init) => {
  db = init.target.result;

  db.onerror = () => {
    console.error('数据库加载失败');
  };

  const table = db.createObjectStore('todo_tb', {
    keyPath: 'id',
    autoIncrement: true,
  });

  table.createIndex('title', 'title', { unique: false });
  table.createIndex('desc', 'desc', { unique: false });
});

如上所示,创建了一个名为todo_db的数据库,然后创建了一个名为todo_tb的对象存储,其中包含两个索引title以及desc 。这些索引允许在存储中复制其值,这类似于在 SQL 中创建表,然后创建两列。

添加新增功能

接下来,要添加保存功能(也就插入),我们继续检索输入到表单中的值,然后将它们保存到数据库中:

const todos = document.querySelector('ol');
const form = document.querySelector('form');
const todoTitle = document.querySelector('#title');
const todoDesc = document.querySelector('#desc');
const submit = document.querySelector('button');

form.addEventListener('submit', addTodo);

function addTodo(e) {
  e.preventDefault();
  const newTodo = { title: todoTitle.value, body: todoDesc.value };
  const transaction = db.transaction(['todo_tb'], 'readwrite');
  const objectStore = transaction.objectStore('todo_tb');
  const query = objectStore.add(newTodo);
  query.addEventListener('success', () => {
    todoTitle.value = '';
    todoDesc.value = '';
  });
  transaction.addEventListener('complete', () => {
    showTodos();
  });
  transaction.addEventListener('error', () => console.log('Transaction error'));
}

添加查询功能

要确认保存功能是否有效,可以打开浏览器的检查功能。在 Chrome 浏览器中,可以在“application(应用程序)”选项卡下的“Storage(存储)”中看到 IndexedDB

如下图所示,我们创建了数据库并将第一个待办事项保存到对象存储中:todo_tb
在这里插入图片描述

为了在用户加载页面时显示可用的待办事项,并提供以前添加和删除的待办事项的视图,我们将创建一个名为 showTodos 的方法。

function showTodos() {
  while (todos.firstChild) {
    todos.removeChild(todos.firstChild);
  }
  const objectStore = db.transaction('todo_tb').objectStore('todo_tb');
  objectStore.openCursor().addEventListener('success', (e) => {
    const pointer = e.target.result;
    if (pointer) {
      const listItem = document.createElement('li');
      const h3 = document.createElement('h3');
      const pg = document.createElement('p');
      listItem.appendChild(h3);
      listItem.appendChild(pg);
      todos.appendChild(listItem);
      h3.textContent = pointer.value.title;
      pg.textContent = pointer.value.body;
      listItem.setAttribute('data-id', pointer.value.id);
      const deleteBtn = document.createElement('button');
      listItem.appendChild(deleteBtn);
      deleteBtn.textContent = 'Remove';
      deleteBtn.addEventListener('click', deleteItem);
      pointer.continue();
    } else {
      if (!todos.firstChild) {
        const listItem = document.createElement('li');
        listItem.textContent = 'No Todo.';
        todos.appendChild(listItem);
      }
    }
  });
}

这个方法从存储中获取待办事项,循环遍历为每个事项创建一个li元素,并将元素添加到网页上的列表元素中,并将每个待办事项元素中添加一个data-id(数据库中的唯一ID)属性,用于后续的删除。

把这个方法添加到IndexDB打开成功的监听中:

openOrCreateDB.addEventListener('success', () => {
  console.log('打开 IndexDB 成功');
  db = openOrCreateDB.result;
  showTodos();
});

数据删除

最后添加一个删除功能。

function deleteItem(e) {
  const todoId = Number(e.target.parentNode.getAttribute('data-id'));
  const transaction = db.transaction(['todo_tb'], 'readwrite');
  const objectStore = transaction.objectStore('todo_tb');
  objectStore.delete(todoId);
  transaction.addEventListener('complete', () => {
    e.target.parentNode.parentNode.removeChild(e.target.parentNode);
    alert(`Todo with id of ${todoId} deleted`);
    console.log(`Todo:${todoId} deleted.`);
    if (!todos.firstChild) {
      const listItem = document.createElement('li');
      listItem.textContent = 'No Todo.';
      todos.appendChild(listItem);
    }
  });
  transaction.addEventListener('error', () => console.log('Transaction error'));
}

这会使用传递给方法的唯一 ID 删除特定的待办事项,并从网页中删除该元素。删除存储中的最后一个待办事项后,它会在待办事项列表的位置显示“空列表”提示。

要确认待办事项已从数据库中删除,请继续检查网页并单击应用程序选项卡。可以看出,现在不包含任何项目

在这里插入图片描述

递增索引数据库版本

IndexedDB 还允许开发人员递增数据库版本。打开数据库时,需要指定所需的版本号。

window.indexedDB.open('todo_db', 1);

如果数据库不存在,则将使用指定的版本创建该数据库。如果数据库已存在,则检查版本号。

如果在 open 方法调用期间指定的版本号高于现有版本,则会通过该事件触发onUpgradeNeeded版本更改事件。此事件允许我们执行数据库架构更改或数据迁移。

这里需要注意的一点是,删除以前的对象存储以添加新选项,创建新存储时也会删除旧存储中的所有其他数据。在升级数据库之前,请注意读出旧内容并将其保存在其他位置。

IndexDB的缺点

数据大小限制

不同的 Web 浏览器对 IndexedDB 中可以存储的最大数据量施加了限制。这些限制因浏览器而异,范围从几m到几百m不等。

不支持DOM操作;不能跨域

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

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

相关文章

极智AI | torch与torchvision版本对应关系速查

欢迎关注我的公众号 [极智视界]&#xff0c;获取我的更多经验分享 大家好&#xff0c;我是极智视界&#xff0c;本文来介绍一下 torch与torchvision版本的对应关系。 邀您加入我的知识星球「极智视界」&#xff0c;星球内有超多好玩的项目实战源码下载&#xff0c;链接&#x…

2023年湖北安全员ABC考试题型有哪些?考多少分及格呢?

2023年湖北安全员ABC考试题型有哪些&#xff1f;考多少分及格呢&#xff1f; 安全员分为交通厅、水利厅和建设厅三个部门颁发&#xff0c;每个部门发的安全员证书也是不一样的。那么今天启程别跟大家讲的是建设厅安全员ABC证书报考的一些事宜&#xff08;启程别是谁&#xff1f…

稀疏光流法跟中移动物体、监督学习聚类、K均值聚类、加载深度神经网络模型、深度神经网络模型的使用

目录 1、稀疏光流法跟中移动物体 2、监督学习聚类 3、K均值聚类 4、加载深度神经网络模型 5、深度神经网络模型的使用 1、稀疏光流法跟中移动物体 //稀疏光流法跟中移动物体 vector<Scalar> color_lut;//颜色查找表 void draw_lines(Mat &image, vector<Point…

程序员如何90天成功转行黑客(网络安全)?

有人说&#xff1a;”黑客到底比程序员高在哪&#xff0c;为什么很多人开始转行了“ 其实黑客都是程序员&#xff0c;但是并不是所有的程序员都是黑客. 从企业和社会需求来看&#xff0c;现在真不缺程序猿 &#xff0c;反而大量的缺安全工程师 &#xff0c;同样8000块月薪&am…

【Spring框架】spring更简单的读取和存储对象

目录 前置工作更加简单的存储Bean对象类注解存储Bean命名问题Java项目标准分层五大类注解之间的关系方法注解Bean重命名Bean的几种方式 前置工作 在spring-config.xml添加如下配置&#xff1a; 配置bean的扫描根路径&#xff1a;只有当前目录下的类才会扫描是否添加了注解&…

【Android Framework系列】第7章 WMS原理

1 前言 前面【Android Framework系列】第5章 AMS启动流程和【Android Framework系列】第6章 AMS原理之Launcer启动流程我们分析了AMS启动以及Launcher启动的整体流程&#xff0c;那Launcher(Activity启动)后&#xff0c;UI是如何渲染到屏幕并且展示出来的呢&#xff1f;我们这…

零代码编程:用ChatGPT批量提取网页上的文本信息内容

现在有很多个网页&#xff1a; 要批量提取网页内的文本&#xff1a; 可以在ChatGPT中这样写提示词&#xff1a; 你是一个Python专家&#xff0c;写一段Python程序&#xff0c;完全提取网页文本内容的任务&#xff0c;下面是一步步的步骤&#xff1a; 打开表格文件&#xff0c…

麒麟SP3X86系统下,安装Oracle11g数据库

目录 1、写在前面 2、准备工作 2.1 环境准备 2.2 数据库安装前准备 2.2.1 安装依赖 2.2.2 系统环境准备 2.2.3 上传软件安装包 2.2.4 安装调图形化界面的依赖和相关设置 3、执行安装程序 1、写在前面 随着国产化进程&#xff0c;各大应用需要在国产服务器上面进行部署…

【Java基础教程】(十五)面向对象篇 · 第九讲:抽象类和接口——定义、限制与应用的细节,初窥模板设计模式、工厂设计模式与代理设计模式~

Java基础教程之面向对象 第九讲 本节学习目标1️⃣ 抽象类1.1 抽象类定义1.2 抽象类的相关限制1.3 抽象类应用——模板设计模式 2️⃣ 接口2.1 接口定义2.2 接口的应用——标准2.3 接口的应用——工厂设计模式 (Factory)2.4 接口的应用——代理设计模式 (Proxy) 3️⃣ 抽象类与…

前端自动化测试工具 Cypress 试用调研记录

目录 前言 环境准备 1.工具&#xff1a;vs code&#xff1b;环境&#xff1a;node.js。 2.安装 cypress 3.安装插件&#xff1a; 4.配置&#xff1a; 5.启动命令&#xff1a; helloworld&#xff1a; 第一个用例 元素定位方式 使用 request 请求进行登录 提取登录方…

SpringMVC中@ControllerAdvice 注解的三种使用场景

全局异常处理 /**可以定义多个方法&#xff0c;不同的方法处理不同的异常。如专门处理空指针的方法&#xff0c;专门处理数组越界…… */ ControllerAdvice public class MyGlobalExceptionHandler{ExceptionHandler(Exception.class)//指定异常处理类型public ModelAndView c…

一、基础-4.MySQL启动和客户端连接

一、启动 方法一&#xff1a; 1、winR&#xff0c;输入services.msc&#xff0c;按回车 2、找到MySQL&#xff0c;右键-启动/停止 MySQL安装后&#xff0c;默认已启动。 方法二、 1、winR&#xff0c;输入cmd&#xff0c;打开命令行 2、输入启动与停止命令 二、客户端连接 …

工业手持终端在工业现场的实际应用

在工业现场&#xff0c;RFID手持终端设备扮演着关键的角色。本文将介绍RFID手持终端设备在工业现场的功能和优势&#xff0c;并探讨其应用场景和最佳实践。同时&#xff0c;提供选择和使用RFID手持终端设备时的注意事项&#xff0c;以帮助企业实现有效的应用策略。 RFID手持终…

uniapp学习之【从一个小程序跳转到另一个小程序】

uni.navigateToMiniProgram({appId: ,path: pages/index/index?id123,extraData: {data1: test},success(res) {// 打开成功} })

【深度学习】日常笔记12

当⾯对更多的特征⽽样本不⾜时&#xff0c;线性模型往往会过拟合。 线性模型没有考虑到特征之间的 交互作⽤。对于每个特征&#xff0c;线性模型必须指定正的或负的权重&#xff0c;⽽忽略其他特征。与线性模型不同&#xff0c;神经⽹络并不局限于单独查看每个特征&#xff0c…

408 计算机考研-001-C语言-C语言基础-考研必学

408 计算机考研-001-C语言-C语言基础-考研必学 本文目录 408 计算机考研-001-C语言-C语言基础-考研必学考研C语言应掌握的内容考研真题2022 年考研真题第 1 题2022 年考研真题第 41 题2021 年考研真题第 42 题 一、打印&#xff1a;Hello, World二、数据类型1. 基本数据类型 三…

项目bug——编码问题报错(java.lang.IllegalStateException)

项目场景&#xff1a; 项目拉下后报错 问题描述 2023-07-17 14:26:07.596 ERROR 14300 — [ main] o.s.boot.SpringApplication : Application run failed java.lang.IllegalStateException: Failed to load property source from ‘file:/Users/wang/IdeaProjects/ms-famil…

ADS交叉耦合振荡器仿真

ADS交叉耦合振荡器仿真 摘要参考视频书籍 环境过程结果分析频率计算瞬态仿真差分电压输出查看相位噪声分析 摘要 本文主要参考视频中如何使用进行ADS交叉耦合振荡器仿真和分析&#xff0c;由于视频中有诸多错误和视频清晰度较低&#xff0c;虽然视频博主及时改正&#xff0c;为…

家用洗地机好用吗、智能洗地机品牌排行榜

在现如今&#xff0c;洗地机不算是什么稀奇的东西了。正相反&#xff0c;越来越多的家庭在清洁的时候都会使用洗地机。因为洗地机相比传统的清洁方式&#xff0c;更加便捷高效&#xff0c;清洁使用的时候简直就是事半功倍&#xff01;那么今天小编就为给大家盘点几款非常适合家…

3Ds max入门教程:快捷键命令和鼠标热键大全

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 起初&#xff0c;您可能需要花一些时间查找热键&#xff0c;但是一旦您使用它们记住了它们&#xff0c;它们将使您以至少两倍的速度产生结果。例如&#xff0c;当您进行建模&#xff08;移动、缩放、旋转等…