Javascript IndexedDB 数据库

indexedDB---掌握浏览器内建数据库的基本用法 IndexedDB 是一个浏览器内建的数据库,它可以存放对象格式的数据,类似本地存储localstore,但是相比localStore 10MB的存储量,indexedDB可存储的数据量远超过这个数值,具体是多少呢?默认情况下,浏览器会将自身所在的硬盘位置剩余容量全部作为indexedDB的存储容量,这里差不多就对应这c盘的剩余容量,所以indexDB有第一个特点,;存储的格式,以对象的键值形式存储数据,注意这里的是一个唯一的索引属性, 阅读详情

IndexedDB 是一个浏览器提供的低级API,用于在客户端存储大量的结构化数据。它比 localStorage 和 sessionStorage 更加强大,可以存储更复杂的数据类型(如对象、数组等),并且支持异步操作。它允许你以键值对的形式存储数据,并提供查询和索引功能来高效地检索数据。

以下是关于 IndexedDB 的一些基本概念和操作示例。

1. IndexedDB 基本概念

  • 数据库 (Database):IndexedDB 中的顶层对象。每个数据库包含多个对象存储区(Object Store)。
  • 对象存储区 (Object Store):类似于传统数据库中的表,用于存储数据。每个对象存储区都有一个键(Key),可以通过键来快速访问数据。
  • 事务 (Transaction):所有对 IndexedDB 的读写操作都必须在事务中进行。
  • 游标 (Cursor):用于迭代数据,尤其是当你需要遍历整个对象存储区时。

2. 创建和使用 IndexedDB

以下是创建数据库、对象存储区以及执行基本的 IndexedDB 操作(如写入和读取)的示例。

示例:使用 IndexedDB 存储和读取数据
// 打开数据库,若不存在会创建
const request = indexedDB.open('MyDatabase', 1);

// 数据库升级(版本号变更时调用)
request.onupgradeneeded = function(event) {
  const db = event.target.result;

  // 创建对象存储区(类似于表)
  const store = db.createObjectStore('users', { keyPath: 'id' });

  // 创建索引(根据名字查询)
  store.createIndex('name', 'name', { unique: false });
};

// 打开数据库成功后执行
request.onsuccess = function(event) {
  const db = event.target.result;
  console.log('Database opened successfully.');

  // 向对象存储区插入数据
  const transaction = db.transaction('users', 'readwrite');
  const store = transaction.objectStore('users');
  
  const user = { id: 1, name: 'John Doe', age: 30 };
  store.add(user);

  transaction.oncomplete = function() {
    console.log('Data saved successfully.');
  };

  transaction.onerror = function() {
    console.log('Error saving data.');
  };
};

// 错误处理
request.onerror = function(event) {
  console.error('Database error:', event.target.errorCode);
};

3. 读取数据

读取数据时,你可以通过键值(key)获取数据,或者使用游标进行遍历。

通过 get 方法读取数据
const request = indexedDB.open('MyDatabase', 1);

request.onsuccess = function(event) {
  const db = event.target.result;
  const transaction = db.transaction('users', 'readonly');
  const store = transaction.objectStore('users');
  
  const getRequest = store.get(1); // 获取 ID 为 1 的用户

  getRequest.onsuccess = function() {
    const user = getRequest.result;
    console.log('User data:', user);
  };

  getRequest.onerror = function() {
    console.log('Error retrieving data.');
  };
};
使用游标(Cursor)遍历数据
const request = indexedDB.open('MyDatabase', 1);

request.onsuccess = function(event) {
  const db = event.target.result;
  const transaction = db.transaction('users', 'readonly');
  const store = transaction.objectStore('users');
  
  const cursorRequest = store.openCursor();
  
  cursorRequest.onsuccess = function(event) {
    const cursor = event.target.result;
    if (cursor) {
      console.log('User:', cursor.value);
      cursor.continue(); // 继续迭代
    } else {
      console.log('No more data.');
    }
  };

  cursorRequest.onerror = function() {
    console.log('Error iterating data.');
  };
};

4. 更新和删除数据

更新数据
const request = indexedDB.open('MyDatabase', 1);

request.onsuccess = function(event) {
  const db = event.target.result;
  const transaction = db.transaction('users', 'readwrite');
  const store = transaction.objectStore('users');
  
  const updatedUser = { id: 1, name: 'John Smith', age: 35 };
  store.put(updatedUser); // 使用 put 方法可以更新已有数据

  transaction.oncomplete = function() {
    console.log('Data updated successfully.');
  };

  transaction.onerror = function() {
    console.log('Error updating data.');
  };
};
删除数据
const request = indexedDB.open('MyDatabase', 1);

request.onsuccess = function(event) {
  const db = event.target.result;
  const transaction = db.transaction('users', 'readwrite');
  const store = transaction.objectStore('users');
  
  store.delete(1); // 删除 ID 为 1 的用户

  transaction.oncomplete = function() {
    console.log('Data deleted successfully.');
  };

  transaction.onerror = function() {
    console.log('Error deleting data.');
  };
};

5. 版本管理

如果你修改了数据库的结构(例如添加新的对象存储区或索引),需要更新版本号并在 onupgradeneeded 事件中进行相应的处理。

const request = indexedDB.open('MyDatabase', 2); // 新版本号 2

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

  // 检查对象存储区是否存在,若不存在则创建
  if (!db.objectStoreNames.contains('users')) {
    const store = db.createObjectStore('users', { keyPath: 'id' });
  }

  // 添加新的索引
  const store = db.transaction.objectStore('users');
  store.createIndex('email', 'email', { unique: true });
};

6. 异常和错误处理

在进行 IndexedDB 操作时,务必进行错误处理,捕获可能发生的异常。

const request = indexedDB.open('MyDatabase', 1);

request.onerror = function(event) {
  console.error('Database error:', event.target.error);
};

7. 清理和删除数据库

如果你需要删除数据库,可以使用 indexedDB.deleteDatabase() 方法:

const request = indexedDB.deleteDatabase('MyDatabase');

request.onsuccess = function() {
  console.log('Database deleted successfully.');
};

request.onerror = function() {
  console.error('Error deleting database.');
};

8. IndexedDB 与 localStorage 比较

特性IndexedDBlocalStorage
数据存储方式支持键值对和索引,可以存储对象、数组等复杂数据只能存储字符串
存储容量可存储更大数据(每个浏览器大约 5MB-50MB)通常每个域名限制 5MB
异步操作支持异步操作不支持异步操作
查询能力支持索引和游标,支持更复杂的查询无查询能力,只能通过键获取数据
支持的数据类型支持存储 JavaScript 对象、数组等只能存储字符串,需要手动序列化和反序列化
使用复杂度相对较复杂,需要更多的配置和操作非常简单,直接使用 setItem 和 getItem

总结

IndexedDB 是一个强大的客户端存储解决方案,适合存储大量结构化数据,支持异步操作和查询。它比 localStorage 更加灵活和高效,但相对而言也更为复杂。适用于需要存储大量数据或进行复杂查询的场景。如果你的应用需要存储超过几MB的数据或者需要更复杂的存储方案,IndexedDB 是一个非常好的选择。

前端数据库:IndexedDB 基础使用 IndexedDB 是浏览器内置的强大 NoSQL 数据库,支持大容量存储、复杂查询和事务操作,是现代 Web 应用的理想选择。本文深入浅出地讲解其核心功能,助你轻松掌握数据管理技巧。 阅读详情

相关推荐

Javascript IndexedDB(Dexie.js) React 存储大量(5-50M)的完整示例

将IndexedDB整合到React应用中,可以为你的应用提供高效的客户端存储解决方案,特别适用于需要存储大量结构化数据或离线功能的场景。为了简化IndexedDB的使用,通常推荐使用封装好的库,如Dexie.js或idb。这些库提供了更简洁和友好的API,方便在React中进行集成。

空 1514

IndexedDB详解

IndexedDB是一种在浏览器端存储数据的方式。既然称之为DB,是因为它丰富了客户端的查询方式,并且因为是本地存储,可以有效的减少网络对页面数据的影响。 有了IndexedDB,浏览器可以存储更多的数据,从而丰富了浏览器端的应用类型。

程序那些事 3万+

Vue项目中使用IndexedDB实现本地数据库存储(idb-js实战)

前段时间在做一个物联网可视化项目时,我遇到这样一个需求:用户需要在断网的情况下仍然能看到上次加载过的园区树形结构和设备坐标信息。最开始我用临时保存数据,但很快发现不够用——只能存字符串,而且容量一般不超过5MB,更别提存储复杂的结构化数据了。后来我想到了一个更专业的方案:** IndexedDB **。它是浏览器原生支持的本地数据库,支持对象存储、索引查询、事务操作、异步API,堪称“前端的小型数据库”。##二、为什么选idb-js。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 435

IndexedDB ?你知道吗?

今天做项目,遇到了 IndexedDB问题。之前对于 IndexedDB只限于了解,但不是很深入。 所以我整理一下 IndexedDB问题。通过查找MDN的官网,又从网上找了几篇文章,终于有些许收获。 分享如下: 相信通过此文,您对于IndexedDB也会有比较深入的认识。

BradenHan的专栏 4863

【IndexedDB 】Vue2、Vue3 结合 Dexie.js 前端数据库应用与实践

本文介绍了如何在Vue3项目中集成Dexie.js实现本地数据管理。Dexie.js是一个轻量级的IndexedDB封装库,提供简洁API和强大查询能力。文章详细解析了项目结构,包括核心文件:dexie.js库文件、types.js(定义表结构和常量)、Database.js(数据库实例创建)、configsDB.js(CRUD操作API)。配置表模块采用Vue3 Composition API设计,包含完整的增删改查功能、加载状态和错误处理机制,并提供了计算属性方便使用。通过这套方案,开发者可以轻松构建高

王佩健的博客 1238

GD32重映射实战:从部分映射到完全映射的配置解析

本文深入解析GD32微控制器的重映射功能,以定时器1的PWM通道为例,详细阐述了从部分映射到完全映射的实战配置流程。文章重点介绍了AFIO模块的核心作用、配置寄存器操作以及关键的避坑指南,旨在帮助开发者灵活优化PCB布局并解决引脚资源冲突,从而高效利用芯片外设功能。

k6l7m8n9的博客 694

浏览器存储--IndexedDB数据库的使用

IndexedDB是一个事务数据库系统,类似于基于SQL的RDBMS。然而,与使用固定列表的基于SQL的RDBMS不同,IndexedDB是一个基于JavaScript的面向对象数据库。为啥要使用呢?随着浏览器的功能不断增强,越来越多的网站开始考虑,将大量数据储存在客户端,这样可以减少从服务器获取数据,直接从本地获取数据。现有的浏览器数据储存方案,都不适合储存大量数据:Cookie 的大小不超过4KB,且每次请求都会发送回服务器;

失眠时间的博客 1万+

ISP之LSC(Lens Shading Correction)

LSC - Lens Shading Correction即镜头暗影校正。

IQ_WXY的博客 5097

用于操作浏览器中的 IndexedDB 数据库的javascript库Dexie.js详解

Dexie.js 是一个高性能、功能丰富的 JavaScript 库,用于操作浏览器中的 IndexedDB 数据库。它提供了一个简单而强大的 API,克服了原生 IndexedDB 的复杂性和限制,使开发者可以更轻松地进行前端持久化数据存储。

maply的博客 5268

ISP一键下载电路分析+74HC1G66GW(信号图)

之前要不用的最小系统的开发板要不就是用的SWD调试口,没有注意过ISP一键下载电路是个怎么回事,因为需要就简单的看了一下野火的ISP一键下载电路。 默认情况一下,一般我们的程序都是从用户闪存也就是内部的FLASH启动的, 对于F103RCT6来说ROM的大小是512kb,启动地址位0x8000000,这个在IDE keil里可以看的到,如下图。 首先简单理解一下ISP是什么: 可以把他理解为芯片厂商出场时固化在ROM当中的一段程序,它的功能就是把你写的程序一点点的搬运到FLASH当中,它引出了两个引脚

lipengyu1363658871的博客 4861

SpringDoc 基本使用指南

SpringDoc 凭借零配置启动注解简洁和深度兼容 Spring 生态的优势,已成为 Spring Boot API 文档的首选工具。自动化- 减少手动维护文档的成本;标准化- 严格遵循 OpenAPI 3 规范;可扩展- 分组、安全控制灵活适配复杂项目。访问即可查看交互式文档(默认路径)

墨鸦的博客 1万+

使用浏览器开发工具调试 Dexie.js 的 IndexedDB 数据库

在调试基于 **Dexie.js** 的 IndexedDB 数据库时,浏览器开发工具提供了强大的支持。本文对具体的调试步骤进行了详细介绍。

maply的博客 2069

K8s认证文件丢失的应急处理与恢复策略

本文详细介绍了Kubernetes(K8s)认证文件丢失时的应急处理与恢复策略。从快速诊断问题范围到不同场景的临时解决方案,再到深度恢复方案(无损重建、部分重置、完全重建),提供了全面的操作指南。同时强调了生产环境中的防丢失设计、高可用集群的特殊处理以及日常运维建议,帮助运维人员有效应对认证文件丢失的紧急情况。

weixin_33743248的博客 327

网页JS自动化脚本(八)使用网页专属数据库indexedDB进行数据收集

【代码】网页JS自动化脚本(八)使用网页专属数据库indexedDB进行数据收集。

weixin_43716462的博客 1608

IDEA出现闪退或打不开的解决方法

本身项目比较大,为了打开这个软件,可调节IDEA中安装的bin目录下有个。打开IDEA的时候过一会便闪退,可以再IDEA的右下角看到如下提示。(如果没有该提示,软件右下角也会有个红色感叹号,点开查看原因即可)闪退的多数原因大致是out of memory,内存溢出。查看任务管理器中的进程:(发现内存随时有溢出的情况)但也需要注意,该参数并不是越大越好,适中即可。只有个别原因是需要管理员权限就可执行!可以尽量减少软件的启动。

码农研究僧的博客 5943

华为OD新系统机试真题 - 准备生日礼物(Py/Java/C/C++/Js/Go)

华为OD机试新系统真题 4.8【准备生日礼物】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【准备生日礼物】

qq_45776114的博客 1478

Web前端入门:JavaScript 一个简单的 IndexedDB 数据库入门示例

由于项目中很少使用,所以这 API 给不了太多建议~~此 API 的应用场景还是有的,可以想想下那些超大文件在线处理应用,比如 ZIP、PSD、PPT 之类的文件,可以将文件解析后存在 IndexedDB 中,在需要的时候查询指定数据即可,这样可以节约很多的解析时间。只是需要注意,所有存在浏览器端的数据,用户清空缓存之后都将不复存在,所以在使用时需做好容错处理~~前端路引Web前端入门第 85 问:JavaScript 一个简单的 IndexedDB 数据库入门示例 - 前端路引 - 博客园。

dsgdauigfs的博客 571

黑猫带你学UFS协议第13篇:UFS初始化详解(Boot Operation)

本文详细解析了UFS设备的初始化过程,包括部分初始化、加载启动代码(可选)和初始化完成三个阶段。重点介绍了如何通过设备描述符和逻辑单元描述符配置引导特性,以及如何从UFS设备加载启动代码。内容适用于嵌入式硬件和存储领域的开发者。

黑猫奥利奥的博客 3555

RxDB 本地数据库实战指南:从浏览器 IndexedDB 到 Node.js 的本地优先数据方案

> 本文基于 RxDB 官方文档 [docs-src/docs/articles/local-database.md](https://link.gitcode.com/i/d8c0165d152b2f7001d6c0f7bfa8a70a) 编写,并结合 [src/rx-database.ts](https://link.gitcode.com/i/b8491d4bc3dd2bd26250fd69

gitblog_00376的博客 86

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

3行代码实现客户端数据库导出:FileSaver.js与IndexedDB实战指南

FileSaver.js是一款强大的客户端文件保存解决方案,特别适合在Web应用中实现客户端文件生成与导出功能。本文将详细介绍如何结合FileSaver.js与IndexedDB,仅用3行核心代码即可实现客户端数据库的完整导出功能,让数据备份与迁移变得前所未有的简单。 ## 📦 快速安装FileSaver.js 要开始使用FileSaver.js,首先需要通过npm或bower安装该库。在项

gitblog_00480的博客 707

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

javascript基础学习系列三百九十:IndexedDB数据库

IndexedDB 是类似于 MySQL 或 Web SQL Database 的数据库。与传统数据库最大的区别在于, IndexedDB 使用对象存储而不是表格保存数据。IndexedDB 数据库就是在一个公共命名空间下的一组对 象存储,类似于 NoSQL 风格的实现。使用 IndexedDB 数据库的第一步是调用 indexedDB.open()方法,并给它传入一个要打开的数据 库名称。如果给定名称的数据库已存在,则会发送一个打开它的请求;如果不存在,则会发送创建并打 开这个数据库的请求。

m0_68635815的博客 818

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

快速上手indexedDb进行业务开发

这篇文章不是对indexedDb进行详细介绍,只是我在上手使用中发现完整介绍怎么使用indexedDB的资料实在太少,大部分就是为了混个阅读量简单介绍一下,所以整理一些我在使用过程中的经验方便大家在业务压力下快速上手 传送门: developer.mozilla.org/zh-CN/docs/… dexie.org/docs/ 在你使用IndexedDB之前你需要先弄懂的 1 什么是Indexed...

weixin_33742618的博客 646

Dexie.js:让浏览器数据库开发变简单的IndexedDB封装库

在Web开发中,客户端数据存储是构建复杂应用的基础能力。传统键值存储如localStorage存在查询功能弱、性能瓶颈等问题,而IndexedDB作为浏览器原生数据库标准,提供了强大的结构化数据存储与索引支持,但API复杂难用。Dexie.js通过声明式Schema定义和Promise-based API,将IndexedDB封装成更符合现代开发习惯的工具库,显著降低了前端数据库开发的心智负担。该库支持事务处理、链式查询、多值索引等高级特性,特别适合需要离线功能、复杂数据查询的Web应用场景,如待办事项管理

weixin_30918633的博客 425

IndexedDB 数据库导出导入工具

IndexedDB 数据库导出导入工具 1. 项目基础介绍 本项目是一个开源项目,旨在提供一种将IndexedDB数据库内容导出为JSON格式并从中导入的方法。它使用JavaScript语言编写,可以在Node.js环境或浏览器环境中使用。IndexedDB是现代浏览器中可用的客户端数据库API,本项目为开发者和测试人员提供了一种方便的方式来保存、加载或清除IndexedDB数据库的内容。 2. ...

gitblog_00753的博客 577

sql.js实战教程:数据库持久化难题破解,Export/Import与IndexedDB存储完整方案

sql.js 是一个让 SQLite 数据库完整运行在浏览器端的 JavaScript 库,但它默认使用内存虚拟文件系统,页面一刷新,数据库里的数据就"蒸发"了——这正是 sql.js 数据库持久化最大的痛点。本文将围绕 Export / Import 两大核心机制,配合浏览器 IndexedDB 存储,给出一套完整的 sql.js 持久化落地方案,帮你彻底解决"刷新丢数据"难题。 ## 一、问

gitblog_00978的博客 887

如何在NW.js桌面应用中高效集成SQLite和IndexedDB数据库

NW.js作为一款强大的桌面应用开发框架,允许开发者直接从DOM/WebWorker调用Node.js模块,为构建功能丰富的桌面应用提供了极大的灵活性。本文将详细介绍如何在NW.js应用中无缝集成SQLite和IndexedDB两种数据库解决方案,帮助你选择最适合项目需求的存储方案,并掌握高效实现的关键技巧。 ## 数据库方案对比:SQLite与IndexedDB的终极选择 在NW.js应用开

gitblog_02786的博客 392
上一篇: Javascript sessionStorage 和 localStorage setItem QuotaExceededError:无法在“存储”上执行“setItem”:设置的值超出了配额。
下一篇: Javascript IndexedDB(Dexie.js) React 存储大量(5-50M)的完整示例
十方来财
十方来财 新星创作者: 编程框架技术领域 新星创作者: 编程框架技术领域
博客等级 码龄14年 8358粉丝 346原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十方来财

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值