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

如何使用IndexedDB?完整CRUD操作指南

Nov 21, 2024 pm 12:48 PM

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

热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

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

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

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

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1655
14
CakePHP 教程
1414
52
Laravel 教程
1307
25
PHP教程
1254
29
C# 教程
1228
24
神秘的JavaScript:它的作用以及为什么重要 神秘的JavaScript:它的作用以及为什么重要 Apr 09, 2025 am 12:07 AM

JavaScript是现代Web开发的基石,它的主要功能包括事件驱动编程、动态内容生成和异步编程。1)事件驱动编程允许网页根据用户操作动态变化。2)动态内容生成使得页面内容可以根据条件调整。3)异步编程确保用户界面不被阻塞。JavaScript广泛应用于网页交互、单页面应用和服务器端开发,极大地提升了用户体验和跨平台开发的灵活性。

JavaScript的演变:当前的趋势和未来前景 JavaScript的演变:当前的趋势和未来前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。

JavaScript引擎:比较实施 JavaScript引擎:比较实施 Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和执行JavaScript代码时,效果会有所不同,因为每个引擎的实现原理和优化策略各有差异。1.词法分析:将源码转换为词法单元。2.语法分析:生成抽象语法树。3.优化和编译:通过JIT编译器生成机器码。4.执行:运行机器码。V8引擎通过即时编译和隐藏类优化,SpiderMonkey使用类型推断系统,导致在相同代码上的性能表现不同。

JavaScript:探索网络语言的多功能性 JavaScript:探索网络语言的多功能性 Apr 11, 2025 am 12:01 AM

JavaScript是现代Web开发的核心语言,因其多样性和灵活性而广泛应用。1)前端开发:通过DOM操作和现代框架(如React、Vue.js、Angular)构建动态网页和单页面应用。2)服务器端开发:Node.js利用非阻塞I/O模型处理高并发和实时应用。3)移动和桌面应用开发:通过ReactNative和Electron实现跨平台开发,提高开发效率。

Python vs. JavaScript:学习曲线和易用性 Python vs. JavaScript:学习曲线和易用性 Apr 16, 2025 am 12:12 AM

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

如何使用Next.js(前端集成)构建多租户SaaS应用程序 如何使用Next.js(前端集成)构建多租户SaaS应用程序 Apr 11, 2025 am 08:22 AM

本文展示了与许可证确保的后端的前端集成,并使用Next.js构建功能性Edtech SaaS应用程序。 前端获取用户权限以控制UI的可见性并确保API要求遵守角色库

从C/C到JavaScript:所有工作方式 从C/C到JavaScript:所有工作方式 Apr 14, 2025 am 12:05 AM

从C/C 转向JavaScript需要适应动态类型、垃圾回收和异步编程等特点。1)C/C 是静态类型语言,需手动管理内存,而JavaScript是动态类型,垃圾回收自动处理。2)C/C 需编译成机器码,JavaScript则为解释型语言。3)JavaScript引入闭包、原型链和Promise等概念,增强了灵活性和异步编程能力。

如何安装JavaScript? 如何安装JavaScript? Apr 05, 2025 am 12:16 AM

JavaScript不需要安装,因为它已内置于现代浏览器中。你只需文本编辑器和浏览器即可开始使用。1)在浏览器环境中,通过标签嵌入HTML文件中运行。2)在Node.js环境中,下载并安装Node.js后,通过命令行运行JavaScript文件。

See all articles