indexDb使用

indexDb是什么?

indexDb是除了cookie,localstorage,sessionstroage外的另一种前端存贮方式。

现有前端存贮比较

image.png

image.png

indexDb特点

  • 无大小限制,适用于前端存贮数据较多场景
  • 存贮结构以对象仓库形式,可以存入任何类型数据,包括js对象,二进制数据
  • 每条数据都有一个独一无二的主键
  • indexDb操作是异步的,不会影响用户其他动作,而localstoreage是同步的
  • indexDb受同源影响,只能访问自身域名下的
  • indexDb默认存贮位置为C:\Users\当 前 的 登 录 用 户\AppData\Local\Google\Chrome\User Data\Default\IndexedDB

indexDb使用

indexDb的增删改查都是通过事务实现的

1判断是否支持indexDb

window.indexedDB = window.indexdeDB || window.mozIndexedDB || window.webkitIndexedDB
if (window.indexedDB) {console.log('浏览器支持indexedDb')
}

2创建indexDb数据库

open会创建or打开数据库

// 创建or打开数据库 open(数据库名,数据库版本号)
const request = window.indexedDB.c('myDb',1);
let db = null;
let db_tb = null;// 数据库创建or打开失败
request.onerror = (error) => {console.log('创建失败',error)
}// 数据库创建or打开成功
request.onsuccess = (res) => {console.log('创建成功', res);db = request.result;
}

3 创建表,主键,索引

一般会在第一次创建数据库或open新版本时创建表

// 数据库升级 首次创建会触发,指定保本号高于当前被持久化的版本号也会触发
equest.onupgradeneeded = (res) => {console.log('升级成功', res);db = request.result;if (!db.objectStoreNames.contains('student')) {db_tb = db.createObjectStore('student', { keyPath: 'id' }) // 创建表,键的选项,指明主键为iddb_tb.createIndex('indexName','name',{unique: false}) // 创建索引, 索引名,创建索引的列,选项 方便查找}}

具体的索引,主键选项
image.png
创建完毕的,表,索引,主键,value
image.png

4 创建事务

// 创建事务,事务操作的对象存贮空间名(表明),事务模式: readonly 只读,readwrite:可读可写,versionchange: 版本升级
let transaction = mdb.transaction(['student'], 'readwrite');// 事务操作处理完成时触发
transaction.oncomplete = (res) => {console.log('执行完毕',res) 
}// 事务操作处理完成时触发
transaction.onerror = (error) => {console.log('报错',error) 
}// 事务中止后触发
transaction.onabort = (error) => {console.log('中止',error) 
}

5 通过事务进行操作

首先通过事务列表获取具体要操作的事务对象

// 获得某个表的具体事务对象
let store = transaction.objectStore('student');

插入数据

let data = {id: '111',name: '李明',age: 12,
}const addRes = store.add(data); // 注意id和name 要和声明主键和索引的字段一样
addRes.onsuccess = (res) => {console.log('插入成功', res)
}addRes.onerror = (error) => {console.log('插入失败', error)
}

获取数据

  • 通过主键获取
// 获取数据通过主键
const getRes = store.get('111');
getRes.onsuccess = (res) => {console.log('获取成功', res)
}getRes.onerror = (error) => {console.log('获取失败', error)
} 
  • 通过索引获取
    // 获取数据通过索引
const getIdxRes = store.index('indexName').get('李四');
getIdxRes.onsuccess = (res) => {console.log('获取成功', res)
}getIdxRes.onerror = (error) => {console.log('获取失败', error)
} 
  • 获取所有
// 获取所有
const getAllRes = store.getAll();getAllRes.onsuccess = (res) => {console.log('获取成功', res)
}getAllRes.onerror = (error) => {console.log('获取失败', error)
} 
  • 获取指定条件
// 获取指定条件索引
const getReRes = store.getAll(IDBKeyRange.upperBound(+new Date()));
getReRes.onsuccess = (res) => {console.log('获取成功', res)
}getReRes.onerror = (error) => {console.log('获取失败', error)
} 

image.png

更新数据

// 更新数据const updateRes = store.put({id: '111',name: "李明",age:10
});updateRes.onsuccess = (res) => {console.log('更新成功', res)
}updateRes.onerror = (error) => {console.log('更新失败', error)
}

删除数据

// 删除数据通过主键const deleteRes = store.delete('111');deleteRes.onsuccess = (res) => {console.log('获取成功', res)
}deleteRes.onerror = (error) => {console.log('获取失败', error)
}

使用的坑

  • indexDb异步操作,任何需要使用上一步操作结果都需要在complete,success回调事件之后再调用
  • 一个事务开启未执行完毕,不能执行另一个事务,可以在事务onComplete回调中监听上一个事务是否执行完毕

参考文档

https://juejin.cn/post/7239259798267904059
https://blog.csdn.net/qq_36823300/article/details/101382736

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python钢筋混凝土结构计算.pdf-T001-混凝土强度设计值

以下是使用Python求解上述问题的完整代码: # 输入参数 f_ck 35 # 混凝土的特征抗压强度(单位:MPa) f_cd 25 # 混凝土的强度设计值(单位:MPa) # 求解安全系数 gamma_c f_ck / f_cd # …

docker命令学习

docker vscode插件出现的问题 docker命令 docker images (查看所有的镜像) docker ps -a (查看所有的容器) docker ps (查看运行的容器) docker run imageID docker run --gpus all --shm-size8g -it imag…

如何将两个pdf合并成一个?pdf合并技巧分享

在日常工作过程当中,我们经常需要处理一些文件,而文件的处理往往是琐碎的,想要提高工作效率,需要选择一些合适的方法,并掌握一定的技巧,那么,如何将两个pdf合并成一个?pdf合并技巧有哪些呢?接…

编写c语言程序调用openssl编译出的动态链接库

文章目录 一、编译生成链接库二、示例一:调用RAND_bytes函数三、示例二:调用SHA256 一、编译生成链接库 下载安装openssl并编译生成链接库的过程在我的另一篇文章中已经详细说明了:Ubuntu中安装OpenSSL 此外,我们还需要提前了解…

20230831工作心得:SQL这块花了挺多时间

1、SQL语句的问题 1、SQL这块花了挺多时间 1、理解业务 要之前自己要查什么数据,再去写SQL,这句话看起来像一句废话,但是很多时候,不知道自己在干嘛。 2、时间 1、需要查询哪个时间字段 表里有很多time有create_time&#…

Flink的checkpoint是怎么实现的?

分析&回答 Checkpoint介绍 Checkpoint容错机制是Flink可靠性的基石,可以保证Flink集群在某个算子因为某些原因(如 异常退出)出现故障时,能够将整个应用流图的状态恢复到故障之前的某一状态,保证应用流图状态的一致性。Flink的Checkpoint机制原理来自“Chandy-Lamport alg…

【ES6】JavaScript中的Symbol

Symbol是JavaScript中的一种特殊的、不可变的、不可枚举的数据类型。它通常用于表示一个唯一的标识符,可以作为对象的属性键,确保对象的属性键的唯一性和不可变性。 Symbol.for()是Symbol的一个方法,它用于创建一个已经注册的Symbol对象。当…

基于ssm+vue斗车车辆交易系统源码和论文

基于ssmvue斗车交易系统源码和论文082 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 摘 要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次…

大漠插件7.2336

更新时间2023-08-28更新内容/v7.23361. YOLO综合工具标记逻辑优化. 更加的方便2. YOLO综合工具增加了默认类. 对于多个同类可以不用每次都进行选择.3. YOLO综合工具增加可以对模型的输入大小进行修改4. YOLO的dmx格式变更.新老版本不混用. 新的dmx格式必须配合新的插件和新的ai…

《Flink学习笔记》——第十二章 Flink CEP

12.1 基本概念 12.1.1 CEP是什么 1.什么是CEP? 答:所谓 CEP,其实就是“复杂事件处理(Complex Event Processing)”的缩写;而 Flink CEP,就是 Flink 实现的一个用于复杂事件处理的库&#xff08…

智汇云舟亮相中国安防工程商集成商大会

智汇云舟亮相中国安防工程商集成商大会,以视频孪生驱动安防行业数字化转型 近日,由中国安全防范产品行业协会指导,永泰传媒主办的中国安防工程商(系统集成商)大会暨第69届中国安防新产品、新技术成果展示在石家庄圆满…

软件架构设计(一) 软件架构的概念

在讲到软件架构的概念时,首先我们要了解到,架构是在做什么样的事情,它在整个软件开发周期中所属什么样的位置。 之前学习软件工程时,我们学到了开发模型,里面涉及到需求分析,概要设计,详细设计,编码,测试。但事实上,没有提到架构这个东西。 为什么这么重要的东西没…