LOGO 首页 OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 技术文档 其他文档  
 
网站管理员

【WEB、JavaScript开发】localStorage 是很好,但我选 IndexedDB!

admin
2026年5月20日 13:1 本文热度 106

在现代 前端Web 开发中,随着应用程序复杂度的逐步增加,本地存储的需求也越来越高频。

虽然 localStorage 和 sessionStorage 可以满足一些简单的数据存储需求,但当需要存储大量结构化数据或进行复杂查询时,它们就显得力不从心了。

这时候,IndexedDB 就成为了一个强大的选择。

本文将带你全面了解 IndexedDB 的基础使用,助你在项目中灵活应用。

IndexedDB 是什么?为啥要用它?

IndexedDB 是浏览器内置的一个 NoSQL 数据库。它和传统的关系型数据库不同,更像是一个键值对存储,但功能更强大。

如果与传统的localStorage 相比,它有以下优点:

开始使用

indexDB 其实是 window 对象的一个属性。 也就是全局变量。 因此我们可以在控制台直接输出
​// 输出 indexedDB 数据库 console.log(indexedDB);

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

1.打开和创建数据库

const dbVersion = 1;//版本号
const request = indexedDB.open('myDatabase', dbVersion);
request.onerror = (event) => {  console.error('数据库打开失败', event.target.error);};
request.onsuccess = (event) => {  const db = event.target.result;  console.log('数据库打开成功');};
request.onupgradeneeded = (event) => {  const db = event.target.result;
  // 创建对象仓库  if (!db.objectStoreNames.contains('books')) {    const store = db.createObjectStore('books', {      keyPath'id'// 主键      autoIncrementtrue // 自增ID    });
    // 创建索引    store.createIndex('title_idx''title', { uniquefalse });    store.createIndex('author_idx''author', { uniquefalse });    store.createIndex('price_idx''price', { uniquefalse });  }};

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

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

版本号是一个重要的机制,用于管理数据库的更新和变更。

当我们尝试打开一个数据库时,系统会检查当前是否存在该数据库:

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

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

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

2.添加数据

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

// 定义数据const book = {  title'JavaScript高级程序设计',  author'Nicholas C. Zakas',  price99.8,  publishYear2025};const transaction = db.transaction(['books'], 'readwrite');const store = transaction.objectStore('books');const request = store.add(book);// db增加成功后的回调request.onsuccess = (event) => {    const books = event.target.result;    console.log(`${author}的书籍:`, books);};

3.更新数据

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

function updateBook(db, book) {  const transaction = db.transaction(['books'], 'readwrite');  const store = transaction.objectStore('books');
  const request = store.put(book);
  request.onsuccess = () => {    console.log('更新成功');  };}

4.删除数据

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

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

function deleteBook(db, id) {  const transaction = db.transaction(['books'], 'readwrite');  const store = transaction.objectStore('books');
  const request = store.delete(id);
  request.onsuccess = () => {    console.log('删除成功');  };}

3. 查询数据

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

function getBook(db, id) {  const transaction = db.transaction(['books']);  const store = transaction.objectStore('books');
  const request = store.get(id);
  request.onsuccess = (event) => {    const book = event.target.result;    console.log('查询结果:', book);  };}

当然除了通过主键ID查询,IndexedDB 还支持索引查询

function getBooksByAuthor(db, author) {  const transaction = db.transaction(['books']);  const store = transaction.objectStore('books');  const index = store.index('author_idx');
  const request = index.getAll(author);
  request.onsuccess = (event) => {    const books = event.target.result;    console.log(`${author}的书籍:`, books);  };}


上面介绍了IndexedDB 核心概念以及基础的增、删、改,查等功能。

当然IndexedDB 远不止这些功能,如果构建一个对本地存储有要求,大容量数据的前端应用,IndexedDB 都能成为你的得力助手!


该文章在 2026/5/20 13:01:15 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2026 ClickSun All Rights Reserved  粤ICP备13012886号-1  粤公网安备44030602007207号