前端超大缓存IndexDB、入门及实际使用

文章目录

  • 往期回顾
  • 项目实战
    • 初始化表
    • 获取列表
    • 新增表的数据项
    • 获取详情
      • 根据ID获取详情
      • 根据其他字段获取详情
    • 删除数据
  • 总结

往期回顾

在这里插入图片描述

在之前的文章中,我们介绍了IndexDB vs Cookies vs Session这几个的对比,但是没有做实际项目的演示,今天我们用实际项目来演示IndexDB的便捷性。

首先需要明确的是IndexDB的适用场景:

  • 离线应用
  • 大型网页游戏
  • 数据缓存
  • 复杂数据管理和查询

项目实战

我们用纯IndexDB来实现表格的基本增删改查的功能!

这只是一个引子,实际上你可以将本示例的思想用于更大的场景
在这里插入图片描述

初始化表

按如下代码格式初始化IndexDB,如果初始不存在,则创建表CryptSetting(实际名称可自定义)和表的字段名,如下objectStore.createIndex()方法。

创建表是最好声明一个自增的唯一主键id,本例为projectId

let db = null;
// 初始化indexDB数据库
async function initDB() {
  const request = window.indexedDB.open('CryptSetting', 1);

  // success 事件表示成功打开数据库
  request.onsuccess = (event) => {
    db = event.target.result;
    // 打开成功之后需要获取数据库列表
    getList()
  };

  // error 事件表示打开数据库失败
  request.onerror = (event) => {
    console.log('打开 IndexedDB 失败');
  };

  // 如果指定的版本号,大于数据库的实际版本号,就会发生数据库升级事件 upgradeneeded
  request.onupgradeneeded = function (e) {
    db = e.target.result;
    let objectStore;
    if ( !db.objectStoreNames.contains('CryptSetting') ) {
      // 索引名称、索引所在的属性、配置对象(说明该属性是否包含重复的值)
      objectStore = db.createObjectStore('CryptSetting', { keyPath: 'projectId', autoIncrement: true });
      objectStore.createIndex('project_name', 'projectName', { unique: false });
      objectStore.createIndex('key_1', 'key', { unique: false });
      objectStore.createIndex('iv_1', 'iv', { unique: false });
    }
  };
}

初始化之后,会在控制台看到如下:
在这里插入图片描述

获取列表

初始化之后,需要获取数据库列表

请注意以下的写法,列表只能一条条获取,可以先声明一个空数组接收,最后统一赋值
此处用到了continue方法
效率还是很快的,不要以为一条条获取速度就慢!

// 获取配置列表
async function getList() {
  loading.value = true
  const transaction = db.transaction([ 'CryptSetting' ], 'readonly');
  const objectStore = transaction.objectStore('CryptSetting');
  const request = objectStore.openCursor(); // 获取所有配置

  // indexDB是一个个获取数据的,所以用数组接收,最后统一赋值
  const tempArr = []
  request.onsuccess = function (event) {
    const cursor = event.target.result;
    if (cursor) {
      tempArr.push(cursor.value);
      cursor.continue(); // 继续遍历下一条数据
    } else {
      tableData.value = tempArr
      loading.value = false
    }
  };

  request.onerror = function () {
    errorTip('获取列表失败')
    loading.value = false
  };
}

新增表的数据项

表初始化之后,其实还是空的表,所以上面获取值为空,所以此时需要往里面添加数据,按如下格式写即可。

注意:此处不传projectId,因为它是主键ID、会自动生成,按123456,
如果6被删除了,下次自动生成的ID为7

function addSettings() {
  const transaction = db.transaction([ 'CryptSetting' ], 'readwrite');
  const objectStore = transaction.objectStore('CryptSetting');
  const { projectName, key, iv } = formData.value // 此处不传projectId,自动生成
  const request = objectStore.add({
    projectName,
    key,
    iv
  });

  request.onsuccess = function (event) {
    successTip('添加成功')
  };

  request.onerror = function (event) {
    errorTip()
  };
}

新增之后,效果如下:在这里插入图片描述

获取详情

根据ID获取详情

// 获取配置详情
function getSettingsDetail(id) {
  const transaction = db.transaction([ 'CryptSetting' ], 'readonly');
  const objectStore = transaction.objectStore('CryptSetting');
  const request = objectStore.get(id);

  request.onsuccess = function (event) {
    const result = event.target.result;
    if (result) {
      title.value = '编辑项目配置'
      isEdit.value = true
      dialogVisible.value = true
      formData.value = result
    } else {
      errorTip('获取失败')
    }
  };

  request.onerror = function(event) {}
}

根据其他字段获取详情

在 IndexedDB 中,get 方法只能根据主键(keyPath)来查询数据。如果你需要根据其他字段(如 projectName、key、iv 等)来查询数据,可以使用索引(index)。索引允许你根据非主键字段来查询数据。
以下示例为:根据 projectName 查询配置详情

function getSettingsByProjectName(projectName) {
  console.log('projectName', projectName);
  const transaction = db.transaction(['CryptSetting'], 'readonly');
  const objectStore = transaction.objectStore('CryptSetting');
  const index = objectStore.index('project_name');
  const request = index.get(projectName);

  request.onsuccess = function (event) {
    const result = event.target.result;
    if (result) {
      title.value = '编辑项目配置';
      isEdit.value = true;
      dialogVisible.value = true;
      formData.value = result;
    } else {
      errorTip('获取失败');
    }
  };

  request.onerror = function (event) {
    console.error('查询失败', event);
    errorTip('查询失败');
  };
}

删除数据

// 删除配置,传参id
function deleteSettings(id) {
  const transaction = db.transaction([ 'CryptSetting' ], 'readwrite');
  const objectStore = transaction.objectStore('CryptSetting');
  const request = objectStore.delete(id); // 假设我们要删除id的记录

  request.onsuccess = function (event) {
    successTip('删除成功');
  };

  request.onerror = function (event) {
    errorTip('删除失败');
  };
}

总结

IndexDB的许多思想都和mysql有相似之处。
我们发现,基本上增删改查都有相似的代码

  const transaction = db.transaction(['CryptSetting'], 'readwrite');
  const objectStore = transaction.objectStore('CryptSetting');

其实这段代码是不能省略的,因为它:

  • 事务的独立性:
    • 每个事务都是独立的,不能共享。一旦事务完成,就不能再使用它。
    • 如果尝试在多个操作中重用同一个事务,会导致错误。
  • 数据一致性:
    • 每个事务确保数据的一致性。如果多个操作共享同一个事务,一个操作失败会导致整个事务回滚,影响其他操作。
  • 错误隔离:
    • 每个事务有自己的错误处理机制。如果一个事务失败,其他事务不会受到影响。
    • 通过每次操作声明新的事务,可以更好地控制错误处理和回滚。

为了确保数据操作的正确性和一致性,每次进行新增、删除、更新等操作时都需要声明新的 transaction 和 objectStore。这是 IndexedDB 的设计原则,确保每个操作都是独立且可靠的。因此,不能省略每次操作时的 transaction 和 objectStore 声明。

以上仅为简易的入门,及细节讲解,更多细节需要实战中探索,感谢打赏!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/946094.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue3学习笔记(11)-组件通信

1.props 父传子 子传夫 父传子 接收用defineProps([]) 空字符串也是假 2.自定义事件 $event:事件对象 ref定义的数据在模板里面引用的时候可以不用.value 3.子传父 宏函数 触发事件 声明事件 defineEmits() 挂载之后3s钟触发 4.命名 肉串命名 5.任意组件通信 mitt pubs…

【高阶数据结构】红黑树封装map、set

红黑树封装map、set 1.源码及框架分析2.模拟实现map和set1.支持 insert 的实现2.支持 iterator 的实现3.map支持 operator [] 的实现 3.总代码1.RBTree.h2.Myset.h3.Mymap.h4.Test.cpp 1.源码及框架分析 SGI-STL30版本源代码,map和set的源代码在map/set/stl_map.h/…

多模态论文笔记——Coca

大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细介绍多模态模型Coca,在DALLE 3中使用其作为captioner基准模型的原因和优势。 文章目录 ALBEF论文模型结构组成训练目标 CoCa​论文模型结构CoCa…

WebGL之Tree.js

tree基于WebGL的库绘制展示3D图形使用场景包括: 网页游:创建交互式的3D游戏,提供沉浸式的游戏体验。数据可视:将复杂的数据以3D形式展示,便于用户理解和分析。产品展:在电商网站上展示产品的3D模型,提供更…

基于PyQt5的UI界面开发——图像与视频的加载与显示

介绍 这里我们的主要目标是实现一个基于PyQt5和OpenCV的图像浏览和视频播放应用。用户可以选择本地的图像或视频文件夹,进行图像自动播放和图像切换以及视频播放和调用摄像头等操作,并且支持图像保存功能。项目的核心设计包括文件路径选择、图像或视频的…

数据结构与算法之动态规划: LeetCode 62. 不同路径 (Ts版)

不同路径 https://leetcode.cn/problems/unique-paths/description/ 描述 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “…

java自定义注解对枚举类型参数的校验

目录 1.前提准备条件 1.1 pom.xml文件依赖: 1.2 枚举类: 1.3 controller接口: 1.4 实体参数: 1.5 knife4j的配置 2.实现要求 3.实现步骤 3.1 自定义注解类: 3.2 使用注解: 3.3 添加注解校验类: …

Type c系列接口驱动电路·内置供电驱动电路使用USB2.0驱动电路!!!

目录 前言 Type c常见封装类型 Type c引脚功能详解 Type c常见驱动电路详解 Type c数据手册 ​​​​​​​ ​​​​​​​ 编写不易,仅供学习,请勿搬运,感谢理解 常见元器件驱动电路文章专栏连接 LM7805系列降压芯片驱动电路…

Mybatis 01

JDBC回顾 select 语句 "select *from student" 演示: 驱动包 JDBC 的操作流程: 1. 创建数据库连接池 DataSource 2. 通过 DataSource 获取数据库连接 Connection 3. 编写要执⾏带 ? 占位符的 SQL 语句 4. 通过 Connection 及 SQL 创建…

基础数据结构--二叉树

一、二叉树的定义 二叉树是 n( n > 0 ) 个结点组成的有限集合,这个集合要么是空集(当 n 等于 0 时),要么是由一个根结点和两棵互不相交的二叉树组成。其中这两棵互不相交的二叉树被称为根结点的左子树和右子树。 如图所示&am…

协议幻变者:DeviceNet转ModbusTCP网关开启机器手臂智能新纪元

技术背景DeviceNet是一种广泛应用于工业自动化领域的现场总线标准,它能够实现控制器与现场设备之间的高效通信,常用于连接各种传感器、执行器以及其他工业设备,如机器人、电机驱动器等,具有实时性强、可靠性高的特点。而ModbusTCP…

Spring Security 3.0.2.3版本

“前言” 通过实践而发现真理,又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识,又从理性认识而能动地指导革命实践,改造主观世界和客观世界。实践、认识、再实践、再认识,这种形式,循环往复以至无…

MiFlash 线刷工具下载合集

MiFlash 线刷工具下载合集 MiFlash 线刷工具下载合集 – MIUI历史版本相较于小米助手的刷机功能,线刷还是偏好使用 MiFlash。特点是界面简单纯粹,有自定义高级选项,可以选择刷机不上 BL 锁,自定义刷机脚本,EDL 刷机模…

Oracle 多租户架构简介

目录 零. 简介一. CDB(Container Database,容器数据库)二. PDB(Pluggable Database,可插拔数据库)三. CDB 与 PDB 的比较四. 用户的种类五. XE 与 XEPDB1 零. 简介 ⏹Oracle 多租户架构(Multit…

掌握大数据处理利器:Flink 知识点全面总结【上】

1.Flink的特点 Apache Flink 是一个框架和分布式处理引擎,用于对无界和有界数据流进行状态计算。 Flink主要特点如下: 高吞吐和低延迟。每秒处理数百万个事件,毫秒级延迟。结果的准确性。Flink提供了事件时间(event--time)和处理时间(proces…

[论文阅读] (34)ESWA2024 基于SGDC的轻量级入侵检测系统

《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座,并分享给大家,希望您喜欢。由于作者的英文水平和学术能力不高,需要不断提升,所以还请大家批评指正,非常欢迎大家给我留言评论,学术路上期…

《向量数据库指南》——Milvus Cloud 2.5:Sparse-BM25引领全文检索新时代

Milvus Cloud BM25:重塑全文检索的未来 在最新的Milvus Cloud 2.5版本中,我们自豪地引入了“全新”的全文检索能力,这一创新不仅巩固了Milvus Cloud在向量数据库领域的领先地位,更为用户提供了前所未有的灵活性和效率。作为大禹智库的向量数据库高级研究员,以及《向量数据…

常用的数据库类型都有哪些

在Java开发和信息系统架构中,数据库扮演着存储和管理数据的关键角色。数据库种类繁多,各有特色,适用于不同的应用场景。 1. 关系型数据库(RDBMS): • 关系型数据库是最为人熟知的数据库类型,数据…

计算机网络—————考研复试

第一章、计算机网络体系结构 1. OSI参考模型和TCP/IP模型: OSI与TCP/IP的记忆方法:只需把OSI的七层记住,将应用层、表示层、会话层一起记,到TCP/IP变成应用层。物理层和数据链路层换成网络接口层。把网络层换个字变成网际层。 而…

从2024看2025前端发展趋势

前言 又至年关,回顾整个2024年,前端行业仍旧百废待兴,IT业界同样也未见有所起色,AI风潮也从狂热兴奋逐步走向了冷静稳定阶段,造成此形势感观并非单一行业或者某一企业之特例,实为政经等综合影响之结果。因…