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("数据库已关闭");
}

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

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

相关文章

educoder中Hive综合应用案例 — 用户搜索日志分析

第1关:2018年点击量最高的10个网站域名 ---------- 禁止修改 ----------drop database if exists mydb cascade; ---------- 禁止修改 -------------------- begin ---------- ---创建mydb数据库 create database mydb;---使用mydb数据库 use mydb;---创建表db_search create…

CVE-2023-27524:Apache Superset未授权访问漏洞复现

文章目录 ​Apache Superset 未授权访问漏洞(CVE-2023-27524)复现0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.漏洞复现 0x06 修复建议 ​Apache Superset 未授权访问漏洞(CVE-2023-27524)复现 0x01 前言 免责声明&#xff1a;请勿利用文…

在线工具收集

在线工具收集 1、在线P图 https://www.photopea.com/ 一款类似于PS的在线抠图软件 ①去除图片中的文字&#xff0c;并填充背景色 第一步&#xff1a;使用矩形选中要清除的文字 第二步&#xff1a;点击编辑选择填充 第三步&#xff1a;选择内容识别&#xff0c;保留透明区域…

操作系统(七)| 设备管理-- 端口 驱动程序 基本I/O控制 磁盘I/O

文章目录 1 设备管理概述1.1 系统总线结构1.2 设备控制器通用结构1.3 I/O设备的模型 2 I/O端口2.1 寻址方式 3 驱动程序4 基本I/O控制方式4.1 程序直接控制4.2 中断I/O方式4.3 DMA方式4.4 I/O通道控制方式 5 I/O管理中的重要思想5.1 设备独立性5.2 SPOOLing技术5.3 I/O软件的多…

c语言 结构数组

为什么要使用结构数组&#xff1f; 例如有一种情况&#xff0c;我们需要存储5名学生的数据。我们可以使用下面给出的结构来存储它。 示例 #include<stdio.h> struct student { char name[20]; int id; float marks; }; void main() {struct student s1,s2,…

前端Date对象的使用锦集

Date 对象用于处理日期与时间。 创造对象 var d new Date(); var d new Date(milliseconds); // 参数为毫秒 var d new Date(dateString); var d new Date(year, month, day, hours, minutes, seconds, milliseconds);方法 getDate() 获取当前日期对象是几日(1-31) cons…

C++标准模板(STL)- 类型支持 (类型修改,添加 const 或/与 volatile 限定符到给定类型,std::add_cv)

类型特性 类型特性定义一个编译时基于模板的结构&#xff0c;以查询或修改类型的属性。 试图特化定义于 <type_traits> 头文件的模板导致未定义行为&#xff0c;除了 std::common_type 可依照其所描述特化。 定义于<type_traits>头文件的模板可以用不完整类型实例…

SAP的四种计量单位

在SAP中物料创建后&#xff0c;一旦发生业务&#xff0c;其基本计量单位便很难修改。由于单位无法满足业务要求&#xff0c;往往会要求新建一个物料替代旧物料。这时候除了要将旧物料上所有的未清业务删除外&#xff0c;还需要替换工艺与BOM中的旧物料。特别是当出现旧物料存在…

Linux学习笔记-Ubuntu下使用Crontab设置定时任务

文章目录 一、概述二、基于crontab的设置2.1 基本命令说明2.2 使用-e指令编辑命令2.2.1 进入编辑模式2.2.2 指令信息格式2.2.4 开启日志1) 修改rsyslog配置文件2) 重启rsyslog3) 查看日志 2.2.3 设置后之后重启服务 三、示例3.1 每隔一分钟往文件中日期3.2 使用-l查看任务列表3…

越南服务器租用:企业在越南办工厂的趋势与当地(ERP/OA等)系统部署的重要性

近年来&#xff0c;越南逐渐成为全球企业布局的热门目的地之一。许多企业纷纷选择在越南设立工厂&#xff0c;以利用其低廉的劳动力成本和优越的地理位置。随着企业在越南的扩张&#xff0c;对于当地部署ERP系统或OA系统等的需求也日益增长。在这种情况下&#xff0c;租用越南服…

上海亚商投顾:北证50指数持续大涨 短剧概念股再爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日震荡调整&#xff0c;深成指跌超1.4%&#xff0c;创业板指跌超1.7%。北证50指数大涨超8%&#xff0c;…

ROS设置DHCP option121

配置时&#xff0c;了解格式很关键&#xff0c;16进制填写格式如下&#xff1a; 将要访问的IPV&#xff14;地址&#xff1a;192.168.100.0/24 192.168.30.254 转换为&#xff1a;掩码 目标网段 网关 0x18c0a864c0a81efe&#xff0c;0不用填写 ROS配置如下图&#xff1a; 抓…

02_使用API_String

StringBuilder StringBuilder 代表可变字符串对象&#xff0c;相对于是一个容器&#xff0c;它里面装的字符串是可以改变的&#xff0c;就是用来操作字符串的好处&#xff1a;StringBuilder 比 String 更适合做字符串的修改操作&#xff0c;效率会更高&#xff0c;代码也会更简…

MacOS “xxxxx“,已损坏,无法打开,你应该将它移到废纸篓

在这里插入图片描述 解决方案 应用程序 - 实用工具中打开终端&#xff0c;输入命令&#xff0c; sudo xattr -r -d com.apple.quarantine 然后将程序拖放至命令窗口&#xff0c;如下图&#xff1a;

22. Spring源码篇之推断构造方法

简介 很多时候我们的构造器都不止一个&#xff0c;那么spring怎么选择的呢&#xff0c;签名介绍了推断构造方法的扩展点&#xff0c;可以使用Autowired注解去选择使用哪个构造器&#xff0c;但是即使这样也有可能有多个Autowired且required为false的构造器&#xff0c;那么还是…

QLineEdit响应editingFinished实现只响应一次

QLineEdit中editingFinished槽函数会在按下enter时响应两次&#xff0c;分别是按下enter和失去焦点的时候&#xff0c;为了能让 QLineEdit只响应其中一次&#xff0c;需定义一个全局变量m_bFlagEnter保存是否enter是否按下&#xff0c;按下后&#xff0c;则在失去焦点的时候做对…

Unity发布IOS后,使用xcode打包报错:MapFileParser.sh:Permissiondenied

1.错误提示 使用xcode打包错误提示&#xff1a;/Users/mymac/Desktop/myproject/MapFileParser.sh: Permission denied 2.解决方案 打开控制台输入&#xff1a;chmod ax /Users/mymac/Desktop/myproject/MapFileParser.sh。按回车键执行&#xff0c;然后重新使用xcode发布程序…

【开源】基于JAVA的在线课程教学系统

项目编号&#xff1a; S 014 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S014&#xff0c;文末获取源码。} 项目编号&#xff1a;S014&#xff0c;文末获取源码。 目录 一、摘要1.1 系统介绍1.2 项目录屏 二、研究内容2.1 课程类型管理模块2.2 课程管理模块2…

机器学习之数据清洗和预处理

目录 Box_Cox Box_Cox Box-Cox变换是一种用于数据预处理和清洗的方法&#xff0c;旨在使数据更符合统计模型的假设&#xff0c;特别是对于线性回归模型。这种变换通过调整数据的尺度和形状&#xff0c;使其更加正态分布。 Box-Cox变换的定义是: y ( λ ) { y λ − 1 λ , i…

【深度学习】卷积神经网络(CNN)

一、引子————边界检测 我们来看一个最简单的例子&#xff1a;“边界检测&#xff08;edge detection&#xff09;”&#xff0c;假设我们有这样的一张图片&#xff0c;大小88&#xff1a; 图片中的数字代表该位置的像素值&#xff0c;我们知道&#xff0c;像素值越大&#…