搜索
首页web前端js教程如何使用IndexedDB?完整CRUD操作指南

How to use IndexedDB? Guide on complete CRUD Operations

IndexedDB 综合指南:浏览器的客户端存储动力源

随着 Web 应用程序变得越来越复杂,对高效客户端存储解决方案的需求也在增长。 IndexedDB 是一种用于存储大量结构化数据的低级 API,对于希望创建强大且具有离线功能的应用程序的 Web 开发人员、软件工程师和 Web 爱好者来说,这是一个强大的工具。

在这篇博客中,我们将通过实际示例探讨 IndexedDB 是什么、它是如何工作的以及如何有效地使用它。无论您是构建渐进式 Web 应用程序 (PWA)、复杂的仪表板还是游戏,IndexedDB 都可以帮助您无缝管理数据。


什么是 IndexedDB?

IndexedDB 是一个基于浏览器的 NoSQL 数据库,设计用于存储大量结构化数据,包括文件和 blob。与 cookie 或 localStorage 不同,IndexedDB 允许您以结构化格式存储数据并使用索引对其进行查询,使其成为复杂用例的理想选择。

IndexedDB 的主要特点:

  • 异步操作:与IndexedDB的交互是非阻塞的,确保性能流畅。
  • 结构化数据存储:以键值对的形式存储数据,通过索引实现高效查询。
  • 离线功能:数据存储在本地,无需互联网连接即可访问。
  • 大存储限制:与 cookie 或 localStorage 相比,提供更多的存储容量。

IndexedDB 的用例:

  • 渐进式网络应用程序:存储离线数据以获得无缝体验。
  • 大数据存储:保存大型数据集,例如用户首选项或应用程序状态。
  • 缓存:缓存 API 响应以提高性能。

IndexedDB 入门

IndexedDB 是如何工作的?

IndexedDB 运行的数据库结构包括:

  • 数据库:数据的顶级容器。
  • 对象存储:存储数据的表,每个表都由唯一的名称标识。
  • 索引:优化对象存储中查询的结构。

IndexedDB API:基本操作

IndexedDB中的主要操作包括:

  1. 打开数据库:创建或访问数据库。
  2. 创建对象存储:定义数据存储。
  3. 执行CRUD操作:添加、读取、更新和删除数据。
  4. 使用事务:以原子方式管理数据操作。

示例 1:创建并打开数据库

以下是如何使用对象存储用户创建名为 MyDatabase 的 IndexedDB 数据库。

const dbName = "MyDatabase";
const dbVersion = 1; // Versioning is required for schema updates.

const request = indexedDB.open(dbName, dbVersion);

request.onupgradeneeded = function (event) {
  const db = event.target.result;

  // Create an object store named 'users' with 'id' as the keyPath
  if (!db.objectStoreNames.contains("users")) {
    db.createObjectStore("users", { keyPath: "id" });
  }
  console.log("Database setup complete");
};

request.onsuccess = function (event) {
  const db = event.target.result;
  console.log("Database opened successfully");
};

request.onerror = function (event) {
  console.error("Error opening database:", event.target.errorCode);
};

说明:

  • indexedDB.open 方法打开或创建数据库。

  • 创建新数据库或升级数据库版本时会触发 onupgradeneeded 事件。

  • 创建名为 users 的对象存储,并以 id 作为主键。


示例 2:将数据添加到对象存储

您可以使用事务将数据添加到对象存储。

function addUser(id, name, email) {
  const request = indexedDB.open("MyDatabase", 1);

  request.onsuccess = function (event) {
    const db = event.target.result;
    const transaction = db.transaction("users", "readwrite");
    const objectStore = transaction.objectStore("users");

    const user = { id, name, email };
    const addRequest = objectStore.add(user);

    addRequest.onsuccess = function () {
      console.log("User added:", user);
    };

    addRequest.onerror = function (event) {
      console.error("Error adding user:", event.target.errorCode);
    };
  };
}

// Add a new user
addUser(1, "John Doe", "john.doe@example.com");

说明:

  • 创建一个读写模式的事务来修改数据。

  • add 方法将数据插入到用户对象存储中。


示例 3:从对象存储中读取数据

使用 get 方法检索数据或迭代所有条目。

function getUser(id) {
  const request = indexedDB.open("MyDatabase", 1);

  request.onsuccess = function (event) {
    const db = event.target.result;
    const transaction = db.transaction("users", "readonly");
    const objectStore = transaction.objectStore("users");

    const getRequest = objectStore.get(id);

    getRequest.onsuccess = function () {
      if (getRequest.result) {
        console.log("User found:", getRequest.result);
      } else {
        console.log("User not found");
      }
    };

    getRequest.onerror = function (event) {
      console.error("Error retrieving user:", event.target.errorCode);
    };
  };
}

// Get user with ID 1
getUser(1);

说明:

  • get 方法通过其键获取特定记录。

  • 数据检索是异步的,因此使用成功和错误处理程序。


示例 4:更新 IndexedDB 中的数据

使用 put 方法更新现有记录。

function updateUser(id, updatedData) {
  const request = indexedDB.open("MyDatabase", 1);

  request.onsuccess = function (event) {
    const db = event.target.result;
    const transaction = db.transaction("users", "readwrite");
    const objectStore = transaction.objectStore("users");

    const putRequest = objectStore.put({ ...updatedData, id });

    putRequest.onsuccess = function () {
      console.log("User updated:", { ...updatedData, id });
    };

    putRequest.onerror = function (event) {
      console.error("Error updating user:", event.target.errorCode);
    };
  };
}

// Update user with ID 1
updateUser(1, { name: "Johnathan Doe", email: "johnathan.doe@example.com" });

示例5:删除IndexedDB中的数据

使用delete方法删除一条记录。

function deleteUser(id) {
  const request = indexedDB.open("MyDatabase", 1);

  request.onsuccess = function (event) {
    const db = event.target.result;
    const transaction = db.transaction("users", "readwrite");
    const objectStore = transaction.objectStore("users");

    const deleteRequest = objectStore.delete(id);

    deleteRequest.onsuccess = function () {
      console.log("User deleted with ID:", id);
    };

    deleteRequest.onerror = function (event) {
      console.error("Error deleting user:", event.target.errorCode);
    };
  };
}

// Delete user with ID 1
deleteUser(1);

IndexedDB 与其他存储解决方案

Feature IndexedDB localStorage sessionStorage
Storage Limit Several MB to GB 5 MB (approx) 5 MB (approx)
Data Format Key-value pairs Key-value pairs Key-value pairs
Asynchronous Yes No No
Structured Data Yes No No

使用 IndexedDB 的最佳实践

  • 正确使用事务:始终管理事务内的数据操作,以确保原子性。

  • 优雅地处理错误:实现错误处理程序以更好地调试和用户反馈。

  • 版本控制:小心增加数据库版本以管理架构更改。

  • 测试离线场景:IndexedDB通常用于离线功能;确保其在没有互联网连接的情况下按预期运行。


结论

IndexedDB 是一个强大的客户端数据存储工具,提供的功能远远超越 localStorage 等传统存储方法。 IndexedDB 支持结构化数据、大存储容量和离线功能,是构建现代 Web 应用程序的必备技术。

要点:

  • IndexedDB 非常适合在本地存储大型且复杂的数据集。

  • 事务是 IndexedDB 中管理数据操作的核心。

  • 它提供强大的离线支持,使其成为渐进式 Web 应用程序的基石。

通过掌握 IndexedDB,您可以构建具有卓越性能和用户体验的可扩展、离线优先的应用程序。立即开始在您的项目中尝试 IndexedDB!

以上是如何使用IndexedDB?完整CRUD操作指南的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
Python vs. JavaScript:您应该学到哪种语言?Python vs. JavaScript:您应该学到哪种语言?May 03, 2025 am 12:10 AM

选择Python还是JavaScript应基于职业发展、学习曲线和生态系统:1)职业发展:Python适合数据科学和后端开发,JavaScript适合前端和全栈开发。2)学习曲线:Python语法简洁,适合初学者;JavaScript语法灵活。3)生态系统:Python有丰富的科学计算库,JavaScript有强大的前端框架。

JavaScript框架:为现代网络开发提供动力JavaScript框架:为现代网络开发提供动力May 02, 2025 am 12:04 AM

JavaScript框架的强大之处在于简化开发、提升用户体验和应用性能。选择框架时应考虑:1.项目规模和复杂度,2.团队经验,3.生态系统和社区支持。

JavaScript,C和浏览器之间的关系JavaScript,C和浏览器之间的关系May 01, 2025 am 12:06 AM

引言我知道你可能会觉得奇怪,JavaScript、C 和浏览器之间到底有什么关系?它们之间看似毫无关联,但实际上,它们在现代网络开发中扮演着非常重要的角色。今天我们就来深入探讨一下这三者之间的紧密联系。通过这篇文章,你将了解到JavaScript如何在浏览器中运行,C 在浏览器引擎中的作用,以及它们如何共同推动网页的渲染和交互。JavaScript与浏览器的关系我们都知道,JavaScript是前端开发的核心语言,它直接在浏览器中运行,让网页变得生动有趣。你是否曾经想过,为什么JavaScr

node.js流带打字稿node.js流带打字稿Apr 30, 2025 am 08:22 AM

Node.js擅长于高效I/O,这在很大程度上要归功于流。 流媒体汇总处理数据,避免内存过载 - 大型文件,网络任务和实时应用程序的理想。将流与打字稿的类型安全结合起来创建POWE

Python vs. JavaScript:性能和效率注意事项Python vs. JavaScript:性能和效率注意事项Apr 30, 2025 am 12:08 AM

Python和JavaScript在性能和效率方面的差异主要体现在:1)Python作为解释型语言,运行速度较慢,但开发效率高,适合快速原型开发;2)JavaScript在浏览器中受限于单线程,但在Node.js中可利用多线程和异步I/O提升性能,两者在实际项目中各有优势。

JavaScript的起源:探索其实施语言JavaScript的起源:探索其实施语言Apr 29, 2025 am 12:51 AM

JavaScript起源于1995年,由布兰登·艾克创造,实现语言为C语言。1.C语言为JavaScript提供了高性能和系统级编程能力。2.JavaScript的内存管理和性能优化依赖于C语言。3.C语言的跨平台特性帮助JavaScript在不同操作系统上高效运行。

幕后:什么语言能力JavaScript?幕后:什么语言能力JavaScript?Apr 28, 2025 am 12:01 AM

JavaScript在浏览器和Node.js环境中运行,依赖JavaScript引擎解析和执行代码。1)解析阶段生成抽象语法树(AST);2)编译阶段将AST转换为字节码或机器码;3)执行阶段执行编译后的代码。

Python和JavaScript的未来:趋势和预测Python和JavaScript的未来:趋势和预测Apr 27, 2025 am 12:21 AM

Python和JavaScript的未来趋势包括:1.Python将巩固在科学计算和AI领域的地位,2.JavaScript将推动Web技术发展,3.跨平台开发将成为热门,4.性能优化将是重点。两者都将继续在各自领域扩展应用场景,并在性能上有更多突破。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具