indexedDB存储
使用
setDBData({ id: 'name', value: '张三', expire: new Date().getTime() + 10000 }, 'info', 'infoDB')
console.log(getDBData('name', 'info', 'infoDB'));
添加或更新数据
async function setDBData(data,storeName = "storeName",dbName = "dbName",version
) {const db = await openDB(dbName, storeName, version);const data_ = await getDataByKey(db, storeName, data.id);// 如果该主键对应的数据已存在,则做更新操作if (data_) {return updateDB(db, storeName, data);}return addData(db, storeName, data);
}
获取数据
async function getDBData(key,storeName = "storeName",dbName = "dbName",version
) {const db = await openDB(dbName, storeName, version);const data_ = await getDataByKey(db, storeName, key);// 设置了有效期,且已过期,则删除数据if (data_?.expire && data_.expire < new Date().getTime()) {await deleteDB(db, storeName, key);return;}return data_;
}
打开数据库
function openDB(dbName, storeName, version = 1) {return new Promise((resolve, reject) => {const indexedDB = window.indexedDB;let db;const request = indexedDB.open(dbName, version);request.onsuccess = function (event) {db = event.target.result; // 数据库对象resolve(db);};request.onerror = function (event) {reject(event);};request.onupgradeneeded = function (event) {// 数据库创建或升级的时候会触发console.log("onupgradeneeded");db = event.target.result; // 数据库对象let objectStore;if (!db.objectStoreNames.contains(storeName)) {objectStore = db.createObjectStore(storeName, { keyPath: "id" }); // 创建表// objectStore.createIndex('name', 'name', { unique: true }) // 创建索引 可以让你搜索任意字段}};});
}
新增数据
function addData(db, storeName, data) {return new Promise((resolve, reject) => {const request = db.transaction([storeName], "readwrite") // 事务对象 指定表格名称和操作模式("只读"或"读写").objectStore(storeName) // 仓库对象.add(data);request.onsuccess = function (event) {resolve(event);};request.onerror = function (event) {reject(event);throw new Error(event.target.error);};});
}
通过主键读取数据
function getDataByKey(db, storeName, key) {return new Promise((resolve, reject) => {const transaction = db.transaction([storeName]); // 事务const objectStore = transaction.objectStore(storeName); // 仓库对象const request = objectStore.get(key);request.onerror = function (event) {reject(event);};request.onsuccess = function (event) {resolve(request.result);};});
}
通过游标读取数据
function cursorGetData(db, storeName) {const list = [];const store = db.transaction(storeName, "readwrite") // 事务.objectStore(storeName); // 仓库对象const request = store.openCursor(); // 指针对象return new Promise((resolve, reject) => {request.onsuccess = function (e) {const cursor = e.target.result;if (cursor) {// 必须要检查list.push(cursor.value);cursor.continue(); // 遍历了存储对象中的所有内容} else {resolve(list);}};request.onerror = function (e) {reject(e);};});
}
通过索引读取数据
function getDataByIndex(db, storeName, indexName, indexValue) {const store = db.transaction(storeName, "readwrite").objectStore(storeName);const request = store.index(indexName).get(indexValue);return new Promise((resolve, reject) => {request.onerror = function (e) {reject(e);};request.onsuccess = function (e) {resolve(e.target.result);};});
}
通过索引和游标查询记录
function cursorGetDataByIndex(db, storeName, indexName, indexValue) {const list = [];const store = db.transaction(storeName, "readwrite").objectStore(storeName); // 仓库对象const request = store.index(indexName) // 索引对象.openCursor(IDBKeyRange.only(indexValue)); // 指针对象return new Promise((resolve, reject) => {request.onsuccess = function (e) {const cursor = e.target.result;if (cursor) {list.push(cursor.value);cursor.continue(); // 遍历了存储对象中的所有内容} else {resolve(list);}};request.onerror = function (ev) {reject(ev);};});
}
更新数据
function updateDB(db, storeName, data) {const request = db.transaction([storeName], "readwrite") // 事务对象.objectStore(storeName) // 仓库对象.put(data);return new Promise((resolve, reject) => {request.onsuccess = function (ev) {resolve(ev);};request.onerror = function (ev) {resolve(ev);};});
}
删除数据
function deleteDB(db, storeName, id) {const request = db.transaction([storeName], "readwrite").objectStore(storeName).delete(id);return new Promise((resolve, reject) => {request.onsuccess = function (ev) {resolve(ev);};request.onerror = function (ev) {resolve(ev);};});
}
删除数据库
function deleteDBAll(dbName) {console.log(dbName);const deleteRequest = window.indexedDB.deleteDatabase(dbName);return new Promise((resolve, reject) => {deleteRequest.onerror = function (event) {console.log("删除失败");};deleteRequest.onsuccess = function (event) {console.log("删除成功");};});
}
关闭数据库
function closeDB(db) {db.close();console.log("数据库已关闭");
}
相关文章:
indexedDB存储
使用 setDBData({ id: name, value: 张三, expire: new Date().getTime() 10000 }, info, infoDB) console.log(getDBData(name, info, infoDB)); 添加或更新数据 async function setDBData(data,storeName "storeName",dbName "dbName",version ) {c…...
双向绑定与单向数据流之争,Solid会取代React吗
现在有一种观点声音逐渐大了起来,认为市面上出现了许多比 React 性能更好的框架,是不是意味着,React 将要被淘汰了? 谈谈我的看法,来做一个深入一点的分析 先说结论:Solid.js 要取代 React 很难 1 双向…...
Java --- JVM之垃圾回收相关知识概念
目录 一、System.gc() 二、内存溢出与内存泄漏 2.1、内存溢出 2.2、内存泄漏 三、Stop the world 四、垃圾回收的并行与并发 4.1、并发 4.2、并行 4.3、并行 vs 并发 4.4、垃圾回收的并发与并行 五、安全点与安全区域 5.1、安全点 5.2、安全区域 六、引用 6.1…...
单节点服务架构
单节点的服务架构: LNMP l:lilnux系统 n:nginx静态页面,转发动态请求 m:mysql数据库,后端服务器,保存用户和密码信息,以及论坛的信息 p:PHP,处理动态请求,动态请求转发数据库,然…...
Ubuntu Server download
前言 Ubuntu——公共云、数据中心和边缘上最受欢迎的 Linux 发行版。自成立以来,Ubuntu 一直在获得市场份额,截至今天已接近 50%。 Ubuntu Server download VersionUbuntu Server 其它主机型号版本Ubuntu AMD历史版下载百度云Ubuntu Server all Ubuntu…...
React 自定义hook 之 防抖和节流
一、简介 防抖和节流主要用于控制事件触发频率,提高页面性能和用户体验。 防抖: 当事件被触发后,在一定时间内有新的对应事件,则会取消老的事件执行。 节流: 当事件触发后,在一定时间内会忽略新的事件执行。 二、技术实现 1、us…...
CVE-2022-21661
简介 CVE-2022-21661是一个与WordPress相关的漏洞,涉及到SQL注入问题。该漏洞主要源于WordPress的WQ_Tax_Query类中的clean_query函数,可能允许攻击者通过控制传递给该函数的数据来控制生成的SQL查询,从而执行任意的SQL代码。 当WordPress的…...
【Python】tensorboard实时查看模型训练过程的方法示例
本文对tensorboard实时查看模型训练过程的方法进行实例详解,以帮助大家理解和使用。 步骤1:查看训练过程保存的文件中是否有这个文件,红框内的。 步骤2:如果有,则打开终端,激活安装过tensorboard的环境。…...
Golang基础-面向对象篇
文章目录 struct结构体类的表示与封装类的继承多态的基本要素与实现interface空接口反射变量的内置pairreflect包解析Struct TagStruct Tag在json中的应用 struct结构体 在Go语言中,可以使用type 关键字来创建自定义类型,这对于提高代码的可读性和可维护…...
全国的科技创新情况数据分享,涵盖2020-2022年三年情况
随着国家对科技创新的重视和大力支持,全国的科技创新情况越来越受到关注。 我们根据中国城市统计年鉴的这方面指标,分析汇总得出全国科技创新情况数据,需要说明的是,由于统计年鉴指标调整,每一年的数据并非字段相同&a…...
visionOS空间计算实战开发教程Day 1:环境安装和编写第一个程序
安装 截至目前visionOS还未在Xcode稳定版中开放,所以需要下载Xcode Beta版。比如我们可以下载Xcode 15.1 beta 2,注意Xcode 15要求系统的版本是macOS Ventura 13.5或更新,也就是说2017年的MacBook Pro基本可以勉强一战,基…...
java常见数值类型取值范围/ int short long BigInteger取值范围
文章目录 一、各类型取值范围 一、各类型取值范围 以下整理java中常用的数值类型取值范围。 类型字节大小最小值最大值取值范围byte8bit-128127-128到127short16bit-2 15 ^{15} 152 15 ^{15} 15-1-32768-32767int32bit-2 31 ^{31} 312 31 ^{31} 31 -1-2,147,483,648 到 2,147…...
echarts产品日常奇怪需求
设置最小刻度导致好多小数,限制两位 yAxis 指定的y轴设置 axisLabel,可以格式化显示 文档地址:https://echarts.apache.org/zh/option.html#yAxis.axisLabel.formatter yAxis: [{type: value,name: 利率,position: right,alignTicks: true,mi…...
CSDN文章保存为MD文档(一)
免责声明 文章仅做经验分享用途,利用本文章所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任,一旦造成后果请自行承担!!! import os import re i…...
【tomcat】java.lang.Exception: Socket bind failed: [730048
项目中一些旧工程运行情况处理 问题 1、启动端口占用 2、打印编码乱码 ʮһ�� 13, 2023 9:33:26 ���� org.apache.coyote.AbstractProtocol init ����: Fa…...
什么是高防IP?有什么优势?怎么选择高防IP?
在当今的互联网环境中,分布式拒绝服务(DDoS)攻击已经成为一种常见的安全威胁。这种攻击通过向目标服务器发送大量的无效流量,使其无法处理正常的请求,从而达到迫使服务中断的目的。作为一个用户,你是否曾遇…...
不存在类型变量 A, T 的实例,使 Collector<T, A, List<T>> 符合 Supplier<R>
报错信息 原因: 不存在类型变量 A, T 的实例,使 Collector<T, A, List<\T>> 符合 Supplier<\R> 来源 测试Stream流的map方法,做算法习惯基本类型定义数组。 map方法:Stream API的一部分。允许以一种声明式的方式处理数据,…...
千兆光模块和万兆光模块的供应链管理
随着网络通信技术的不断发展,千兆光模块和万兆光模块已逐渐成为现代网络建设中不可缺少的组成部分。它们在云计算、数据中心、大规模机房以及企业内部网络等领域广泛应用,已经成为大家熟知的产品。 千兆光模块和万兆光模块的工作原理基本相同ÿ…...
pytorch训练出现的bug
训练过后发现.csv文件左侧出现了几列unname和一列0,1,2。这个时候在训练就会从unname那一列开始训练。我们需要把这几列删除,之后再重新训练 问题应该是执行完了这个语句过后就会出现了。 执行完后,记得删。...
【AGC】集成AGC服务上架应用市场审核问题
【关键字】 AGC、应用市场、审核 【问题描述】 集成了AGC服务,上架到应用市场不通过,检查发现是com.huawei.secure.android.common.ssl.util.c.doInBackground 存在获取安装列表行为。 已经按照sdk 设置了,但是检测还是有授权前去获取安装列…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...
