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 设置了,但是检测还是有授权前去获取安装列…...
Adobe Illustrator批量替换脚本:告别手动操作,10倍提升设计效率的终极解决方案
Adobe Illustrator批量替换脚本:告别手动操作,10倍提升设计效率的终极解决方案 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 还在为Adobe Illustrator中重…...
数据类型【TINYINT、SMALLINT、INT、BIGINT、decimal(18,2)】表示意思
数据类型占用字节占用位数取值范围(有符号)INT8 / TINYINT1 字节8 位-128 到 127INT16 / SMALLINT2 字节16 位-32,768 到 32,767INT32 / INT4 字节32 位-21亿 到 21亿INT64 / BIGINT8 字节64 位约 922亿亿Q:TINYINT 就是1字节 为什么可以存-128 到127呢?…...
解放你的Dell G15:这款开源散热控制工具如何让游戏本重获新生
解放你的Dell G15:这款开源散热控制工具如何让游戏本重获新生 【免费下载链接】tcc-g15 Thermal Control Center for Dell G15 - open source alternative to AWCC 项目地址: https://gitcode.com/gh_mirrors/tc/tcc-g15 想象一下这样的场景:你正…...
别再傻傻分不清了!用Python和R语言代码实例,5分钟搞懂PDF和CDF的区别
别再傻傻分不清了!用Python和R语言代码实例,5分钟搞懂PDF和CDF的区别 第一次接触概率密度函数(PDF)和累积分布函数(CDF)时,很多人都会被这两个看似相似实则完全不同的概念搞得晕头转向。作为一名…...
3种高效处理方案:如何优化AutoDock-Vina中金属离子电荷的技术实现
3种高效处理方案:如何优化AutoDock-Vina中金属离子电荷的技术实现 【免费下载链接】AutoDock-Vina AutoDock Vina 项目地址: https://gitcode.com/gh_mirrors/au/AutoDock-Vina 在分子对接研究中,金属离子配位体系的准确处理一直是计算药物发现的…...
大模型Tokenizer原理:深入理解BPE与WordPiece子词编码技术
大模型Tokenizer原理:深入理解BPE与WordPiece子词编码技术 在大型语言模型的技术架构中,Tokenizer(分词器)是连接原始文本与模型输入的关键桥梁。不同于简单的按空格或标点分割,一个优秀的分词器需要将文本切分为模型能…...
Python和Java默认排序算法TimSort,为什么比快排还快?手把手带你拆解源码
Python与Java为何选择TimSort:从理论优势到工程实践的全景解析 当你在Python中调用sorted()或在Java中使用Arrays.sort()时,背后运行的并非教科书上的经典算法,而是一个融合了多种策略的混合型排序算法——TimSort。这个由Tim Peters在2001年…...
3步获取全国高铁数据:Parse12306开源工具完整使用指南
3步获取全国高铁数据:Parse12306开源工具完整使用指南 【免费下载链接】Parse12306 分析12306 获取全国列车数据 项目地址: https://gitcode.com/gh_mirrors/pa/Parse12306 Parse12306是一个强大的开源工具,专门用于从12306官方平台自动化采集全国…...
从ONFI到SCA:手把手拆解NAND接口演进史与未来趋势
从ONFI到SCA:NAND接口技术演进与性能突围之路 在存储技术的竞技场上,NAND闪存接口标准的每一次迭代都像一场精密的齿轮升级——当数据洪流以TB级规模冲刷存储介质时,接口这个"数据阀门"的吞吐效率直接决定了整个系统的性能天花板。…...
避坑指南:在树莓派Ubuntu22.04上配置MCP2515 CAN接口时,为什么你的can0接口出不来?
树莓派Ubuntu22.04配置MCP2515 CAN接口疑难解析:从设备树到内核模块的深度排错 当你兴奋地将MCP2515模块连接到树莓派4B的SPI接口,按照网上教程一步步操作,却在最后发现ifconfig -a里根本看不到期待的can0接口时,那种挫败感我深有…...
