首页 > 其他分享 >indexedDB的具体使用方法

indexedDB的具体使用方法

时间:2024-12-01 13:11:00浏览次数:5  
标签:indexedDB 存储 const 数据库 request 具体 方法 event store

IndexedDB简介

IndexedDB 是浏览器提供的一种本地存储解决方案,用于存储大量的结构化数据。它支持异步操作,允许你存储对象、数组、甚至是二进制数据,并为它们提供索引以提高查询效率。它的设计目的是用于处理大规模数据存储,适合离线应用和大数据处理。

IndexedDB的特点

  1. 存储大数据:相比于 localStorageIndexedDB 支持存储大量数据(通常是几十MB甚至GB级别)。
  2. 异步操作IndexedDB 是异步的,避免了阻塞UI线程。
  3. 对象存储:可以存储 JavaScript 对象,而不仅仅是字符串(localStorage 只能存储字符串)。
  4. 事务支持IndexedDB 支持事务,可以确保操作的原子性。
  5. 支持索引:通过创建索引,可以提高数据查询的效率。

如何使用IndexedDB

IndexedDB 是通过 JavaScript 的 indexedDB 对象进行操作的。以下是一个简单的使用流程,包括如何打开数据库、添加数据、读取数据、删除数据等。


1. 打开数据库 (indexedDB.open)

使用 indexedDB.open() 打开数据库或创建一个新的数据库。如果数据库不存在,它会创建一个新的数据库;如果数据库已存在,则使用现有的数据库。

const request = indexedDB.open('myDatabase', 1); // 打开或创建数据库,版本号为1
  • 参数

    • 'myDatabase':数据库的名称。
    • 1:数据库的版本号。每次数据库结构变化时,需要增大版本号。
  • 事件

    • onupgradeneeded:当数据库创建或版本升级时触发,用来创建对象存储区(object store)和索引。
    • onsuccess:当数据库打开成功时触发。
    • onerror:当打开数据库失败时触发。
const request = indexedDB.open('myDatabase', 1);

// 处理数据库版本升级,创建对象存储区
request.onupgradeneeded = (event) => {
  const db = event.target.result;
  if (!db.objectStoreNames.contains('myStore')) {
    const store = db.createObjectStore('myStore', { keyPath: 'id' }); // 创建对象存储区
    store.createIndex('name', 'name', { unique: false }); // 创建索引
  }
};

// 数据库打开成功
request.onsuccess = (event) => {
  const db = event.target.result;
  console.log('数据库打开成功');
};

// 打开数据库失败
request.onerror = (event) => {
  console.error('打开数据库失败', event.target.error);
};

2. 添加数据 (put)

一旦数据库打开成功,你可以通过事务和对象存储区(object store)向数据库中添加数据。

const addData = (db, data) => {
  const transaction = db.transaction('myStore', 'readwrite'); // 读写事务
  const store = transaction.objectStore('myStore'); // 获取对象存储区
  const request = store.put(data); // 添加或更新数据

  request.onsuccess = () => {
    console.log('数据存储成功');
  };

  request.onerror = (event) => {
    console.error('数据存储失败', event.target.error);
  };
};
  • 事务db.transaction('storeName', 'readwrite') 创建一个事务。可以设置事务的权限为 'readonly''readwrite'
  • put():如果数据的 key 已经存在,则会更新该数据;如果不存在,则会插入新数据。

3. 读取数据 (get)

通过 get() 方法可以从对象存储区中获取数据。需要传入数据的主键(key)。

const getData = (db, key) => {
  const transaction = db.transaction('myStore', 'readonly'); // 只读事务
  const store = transaction.objectStore('myStore'); // 获取对象存储区
  const request = store.get(key); // 根据主键获取数据

  request.onsuccess = (event) => {
    const result = event.target.result;
    if (result) {
      console.log('获取的数据:', result);
    } else {
      console.log('未找到该数据');
    }
  };

  request.onerror = (event) => {
    console.error('读取数据失败', event.target.error);
  };
};
  • get():根据主键 key 获取数据。如果数据存在,返回对应的数据;如果数据不存在,返回 null

4. 删除数据 (delete)

可以使用 delete() 方法删除指定主键的数据。

const removeData = (db, key) => {
  const transaction = db.transaction('myStore', 'readwrite'); // 读写事务
  const store = transaction.objectStore('myStore'); // 获取对象存储区
  const request = store.delete(key); // 根据主键删除数据

  request.onsuccess = () => {
    console.log('数据删除成功');
  };

  request.onerror = (event) => {
    console.error('删除数据失败', event.target.error);
  };
};
  • delete():根据指定的 key 删除数据。

5. 创建索引 (createIndex)

IndexedDB 允许你为对象存储区创建索引,索引可以加速对数据的查询。可以通过 createIndex() 方法来创建索引。

const request = indexedDB.open('myDatabase', 2); // 升级到版本2
request.onupgradeneeded = (event) => {
  const db = event.target.result;
  const store = db.createObjectStore('myStore', { keyPath: 'id' });
  store.createIndex('name', 'name', { unique: false }); // 创建索引
};
  • createIndex():创建一个索引。参数包括索引名称、索引字段、是否唯一。

6. 事务和错误处理

IndexedDB 使用事务来确保操作的原子性。可以同时进行多个操作,事务会确保所有操作都成功,或者在出错时回滚。

const transaction = db.transaction('myStore', 'readwrite');
transaction.onerror = (event) => {
  console.error('事务出错:', event.target.error);
};

const store = transaction.objectStore('myStore');
store.put({ id: 1, name: 'John' });
store.put({ id: 2, name: 'Jane' });

7. 列出所有数据

IndexedDB 提供了 openCursor() 方法,可以用来遍历对象存储区中的所有数据。

const listAllData = (db) => {
  const transaction = db.transaction('myStore', 'readonly');
  const store = transaction.objectStore('myStore');
  const request = store.openCursor();

  request.onsuccess = (event) => {
    const cursor = event.target.result;
    if (cursor) {
      console.log('数据:', cursor.value);
      cursor.continue(); // 继续遍历
    } else {
      console.log('所有数据已遍历完');
    }
  };

  request.onerror = (event) => {
    console.error('遍历数据失败', event.target.error);
  };
};

总结

  • 数据库的打开:通过 indexedDB.open() 打开数据库,如果数据库不存在,则会创建新数据库。
  • 对象存储区:通过 createObjectStore() 创建一个对象存储区来存储数据。
  • 增、查、改、删操作:通过事务和对象存储区提供的 put(), get(), delete() 等方法进行增、查、改、删操作。
  • 索引:通过 createIndex() 方法为数据字段创建索引,提高查询效率。
  • 事务:使用事务来确保多次操作的原子性。

IndexedDB 适合存储大量数据,并且可以进行高效的查询操作。在需要离线存储大量结构化数据时,它是一个非常合适的选择。

标签:indexedDB,存储,const,数据库,request,具体,方法,event,store
From: https://www.cnblogs.com/Tifahfyf/p/18579713

相关文章

  • 降维方法 主成分分析和因子分析
    初次发布于我的个人文档。(每次都是个人文档优先发布哦)本文简要介绍一下主成分分析和因子分析的原理,但是不涉及具体代码实现。这是因为现在已经有很多现成的软件或库实现了这两个算法,读者只需要一两句简单的命令就可以使用了,所以没有必要在这里讲解。而且你可能会在PythonR......
  • vue基础之4:el与data的两种写法、理解MVVM、Object.defineProperty方法、数据代理
    欢迎来到“雪碧聊技术”CSDN博客!在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将不断探索Java的深邃世界,分享最新的技术动态、实战经验以及项目......
  • String类的三种常见构造方法
    1.根据构造方法创建字符串对象1.publicString()创建一个空字符串,里面不包含任何内容2.publicString(char[]chs)创建一个字符数组,将其拼接成字符串对象3.publicString(Stringoriginal)根据输入的字符串,创建字符串对象2.疑惑:1.我们原来创建了对象,将其直接打印,出来的是一......
  • 在Windows 10和Windows 11上,你可以通过设置Windows防火墙来限制外网访问,同时保持局域
    在Windows10和Windows11上,你可以通过设置Windows防火墙来限制外网访问,同时保持局域网的访问不受影响。以下是具体操作步骤:方法1:使用Windows防火墙设置限制打开防火墙设置:按 Win+R 打开运行对话框,输入 wf.msc 并按回车,打开“Windows防火墙高级安全”窗口。创建......
  • 当网站遇到性能问题时,你是如何一步步解决的?说说你的方法
    当网站遇到性能问题时,我会按照以下步骤进行分析和解决,并迭代这个过程直到性能达到预期:1.问题界定和测量:明确性能瓶颈的具体表现:网站加载慢?动画卡顿?特定操作响应迟缓?用户感受到的卡顿是什么样的?量化性能指标:使用性能分析工具(例如ChromeDevTools,Lighthouse,WebP......
  • 使用js写一个计算字符串的字节数的方法
    functiongetByteLength(str){letbyteLength=0;for(leti=0;i<str.length;i++){constcharCode=str.charCodeAt(i);if(charCode<=0x007f){byteLength+=1;}elseif(charCode<=0x07ff){byteLength+=2;......
  • 用不同的方法改装下面的代码,使它的结果输出为0-4[代码]
    你没有提供代码。请提供你想修改的代码,我会尽力帮你修改它,使输出结果为0到4。为了帮助你,我先提供一些常见的JavaScript代码片段以及如何修改它们来输出0到4:1.使用for循环:for(leti=0;i<5;i++){console.log(i);}2.使用while循环:leti=0;while(i<......
  • halcon3d点云补全方法
    一,主要目标是通过点云的拼接,将多个角度的点云拼接成一个完整的的点云,方法是通过计算几个点云的重叠区域刚性变换关系,然后通过全局匹配的方式,将点云进行整体的放射变换对其,再重采样!二,要用到的两个重要算子register_object_model_3d_pair(::ObjectModel3D1,ObjectModel3......
  • js的sort方法运用场景有哪些?
    JavaScript的sort()方法主要用于对数组的元素进行排序。它有很多应用场景,在前端开发中尤为常见:1.列表排序:这是最常见的应用场景。当需要按照字母顺序、数字大小、日期先后等对列表项进行排序展示时,sort()方法是必不可少的。例如,电商网站上的商品列表,可以根据价格、销......
  • 你认为全栈工程师应该具体什么样的条件(技能、素质等)?
    一个合格的全栈工程师,尤其是在前端开发也精通的情况下,需要具备以下条件:技能方面:前端开发:HTML,CSS,JavaScript:这是前端开发的三大基石,需要深入理解和熟练运用。包括最新的HTML5、CSS3特性以及ES6+语法。前端框架/库:至少熟练掌握React、Vue或Angular其中一种,并了解......