indexDb使用

news2024/10/7 10:15:08

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' }) // 创建表,键的选项,指明主键为id
     db_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.coloradmin.cn/o/953889.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业智能知识管理在线工具语雀、helplook、石墨文档、Baklib怎么样?

语雀、helplook、石墨文档和Baklib都是企业智能知识管理的在线工具,它们都提供了一系列功能来帮助企业管理和共享知识。下面我将对这些工具进行详细的介绍和评价。 语雀: 语雀是一款功能强大的在线知识管理工具,它提供了丰富的功能和优秀的…

Java对接海康威视(二次开发)组织信息、人员信息等

一.获取合作方数据 1.在【综合安防平台】的【关于】中前往【运行管理中心】 2.输入账户和密码进入【运行管理中心】 3.点击【状态监控】,搜索【能力开放网关】,点击【API管理】,查询可以对接的接口,点击对应的接口名称可以查看请求参数和返回…

抽象又有点垃圾的JavaScript

常数的排序 let x 10;let y 20;let z;if (x < y) {z x;x y;y z;}console.log(x, y);//x 20 ,y 10 通过一个媒介来继承x的初始值&#xff0c;然后将y的值赋值给x&#xff0c;再把媒介z的值赋值给y&#xff0c;达到排序 一个可重复使用的排序程序 第一种 function s…

微力同步私人网盘部署教程:利用端口映射实现远程访问的解决方案

文章目录 1.前言2. 微力同步网站搭建2.1 微力同步下载和安装2.2 微力同步网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 私有云盘作为云存储概念的延伸&#xff0c;虽然谈不上多么新颖&#xff0c;但是其…

ReID网络:MGN网络(4) - Loss计算

1. MGN Loss MGN采用三元损失(Triplet Loss)。 三元损失主要用于ReID算法&#xff0c;目的是帮助网络学习到一个好的Embedding信息。之所以称之为三元损失&#xff0c;主要原因在于在训练中&#xff0c;参与计算Loss的分别有Anchor、Positive和Negative三方。 2. Triplet Lo…

实现远程访问Linux堡垒机:通过JumpServer系统进行安全的服务器管理

文章目录 前言1. 安装Jump server2. 本地访问jump server3. 安装 cpolar内网穿透软件4. 配置Jump server公网访问地址5. 公网远程访问Jump server6. 固定Jump server公网地址 前言 JumpServer 是广受欢迎的开源堡垒机&#xff0c;是符合 4A 规范的专业运维安全审计系统。JumpS…

Vue2里监听localstorage里值的变化

有的时候,我们需要根据本地缓存在localstorage里值的变化做出相应的操作,这就需要我们监听localstorage: 首先,我们在src下的libs文件夹下新建一个stroage.js用于重写setItem事件,当使用setItem的时候,触发,window.dispatchEvent派发事件 const Stroage = {// 重写set…

8.Redis-set

Set 常用命令saddsmemberssismemberscardspopsmovesrem集合间操作sinter 交集sinterstoresunion 并集sunionstoresdiff 差集sdiffstore 命令总结 内部编码应用场景使用 set来保存用户的“标签” set(集合)就是把一些有关联的数据放刀一起。 它与list的区别如下&#xff1a; 集合…

DP4863 国产双声道音频功率放大器芯片

产品概述&#xff1a; DP4863 电路是一种双声道桥接音频功率放大器。在 5 V 电源电压下&#xff0c;它能向 4 Ω 负载提供 2.2 W 的输出功率&#xff0c;或向 3 Ω 负载提供 2.5 W的输出功率&#xff0c;THD N 小于 1 %。此外&#xff0c;它还具有耳机输入端&#xff0c;可驱…

应用程序管理工具

应用程序管理是 DevOps 的重要组成部分。它可以定义为在所有阶段监控和管理软件应用程序的可用性、运行状况、性能和功能的过程&#xff0c;包括规划、设计、构建、测试、部署、维护和更新。这意味着应用程序从概念到停止都受到监控。 应用程序管理的重要性 管理应用程序可确…

关于一个git的更新使用流程

1.第一步使用git bash 使用git bash命令来进行操作&#xff08;当然我是个人比较喜欢用这种方法的&#xff09; 2. 第二步&#xff1a;连接 3.第三步&#xff1a;进入 4.第四步&#xff1a;查看分支 5.第五步&#xff1a;切换分支 将本地文件更新后之后进行提交 6.第六步&am…

山西电力市场日前价格预测【2023-09-01】

日前价格预测 预测明日&#xff08;2023-09-01&#xff09;山西电力市场全天平均日前电价为305.25元/MWh。其中&#xff0c;最高日前电价为349.30元/MWh&#xff0c;预计出现在19: 30。最低日前电价为240.52元/MWh&#xff0c;预计出现在12: 45。 价差方向预测 1&#xff1a; 实…

业主方怎么管理固定资产

业主方可以通过以下几种方式来管理固定资产&#xff1a; 建立资产管理制度&#xff1a;制定明确的资产采购、使用、维护、报废等流程和标准&#xff0c;确保资产管理的规范性和透明度。 采用专业的资产管理软件&#xff1a;通过数字化手段对固定资产进行管理和监控&#xff0c;…

【Dart】学习使用(二):基本类型

前言 基本类型是语言的基础。 Dart 语言支持以下基础类型&#xff1a;Numbers(int、double)&#xff0c; 整形Strings(String), 字符串Booleans(bool) , 布尔型Records((value1,value2)) 记录Lists(List ) 数组Sets(Set) 集合Maps(Map) 映射Runes(Runes,通常由 characters AP…

docker作业

目录 1、使用mysql:5.6和 owncloud 镜像&#xff0c;构建一个个人网盘。 1.1启动镜像 1.2启动cloud镜像 1.3浏览器访问 ​编辑 2、安装搭建私有仓库 Harbor 2.1下载docker-compose 2.2 磁盘挂载&#xff0c;保存harbor 2.3 修改配置文件 2.4安装 2.5浏览器访问 2.6 新…

解决OpenCV的GStreamer warning警告

调用 cv::VideoCapture出现的警告&#xff1a; [ WARN:0] global ../modules/videoio/src/cap_gstreamer.cpp (1758) handleMessage OpenCV | GStreamer warning: Embedded video playback halted; module v4l2src0 reported: Internal data stream error. [ WARN:0] global .…

匿名函数( lambda 表达式)

在 C 中&#xff0c;匿名函数也被称为 lambda 表达式。C11 引入了 lambda 表达式&#xff0c;使得在需要函数对象&#xff08;函数符&#xff09;的地方可以使用匿名函数来代替。 lambda 表达式的基本语法如下&#xff1a; [capture list] (parameter list) -> return typ…

pyinstaller入门小例子

【问题提出】 我们知道C编译之后会直接生成可执行文件&#xff0c;其他人电脑上即使没有安装编译器&#xff0c;也可以直接执行。 而python是一门解释性语言&#xff0c;不能像C一样直接编译。所以一个自然的想法就是&#xff0c;将python程序及其解释器一起打包&#xff0c;这…

将符号分隔的文本文件txt转换为excel的实现

文本文件如下&#xff1a; 现在不好处理&#xff0c;打算将其转换为excel&#xff0c;其中通过冒号分割&#xff1a;line.split(":") main方法如下&#xff1a; public static void main(String[] args) {String textFilePath "D:\\zoom\\期刊\\J_Medline\\J_…

【力扣】62. 不同路径 <动态规划>

【力扣】62. 不同路径 一个机器人位于一个 m m m x n n n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。问总共有多少条…