IndexedDB 数据库的使用

2023-05-16

前端的存储方式

前端的存储,可以使得页面交互更加友好,特别是在保存草稿,网络差的情况下对用户来说是很有用的。

前端的存储方式有多种,像 Local storage、Session storage、IndexedDB、Web Sql、Cookies等这几种。
在这里插入图片描述

使用场景

我们比较常见的是本地存储,像用户的基本信息,需要在多个页面需要的时候,可以在登入的时候存储在本地,及时下次退出之后,登入信息还可以保存,这样减少了用户的输入量。
但是,它也是有缺点的,它的存储大小只有5M,只能满足相对较小的数据存储,如果是大量的数据,是不现实的,比如草稿数据。

特殊场景

在公司页面里面使用app的时候,会遇到网络情况特别差的时候,导致这些数据没法提交,如果不存储的话,下次就直接没有了,这让用户投诉了起来。于是,我只能想着本地存储了,当时想到了IndexedDB,但是之前没使用过,公司也没找到案例,搜了很多文章也发现代码写的很复杂,于是我放弃了,先使用local storage 使用试试效果,效果是很好,但是存储空间实在是没法满足,两张工单保存一些数据就满了,导致保存失败。
当时想的是保存失败的策略,全部清除或者就失败把,但是都不满足要求。
于是,必须去调研一下IndexedDB.

现成的库

当时的思路是找别人的案例,github,但是都没有一个比较简单,完整的case。后来转变了思路,我应该找下是否有成熟的库,功夫不负有心人,找到了一个库,dexie,看了一下官网以及github的star,文档非常的完善,以及star人数也达到9K。还有专门针对vue react 等不同框架的文档,于是就上手使用啦。

优点

  1. 可以存储大量的数据
  2. 没有严格的数据类型限制
  3. 异步
  4. dexie库 (index DB)

代码实现

  • 写一个公共的db.ts,用于定义数据库和表
// db.ts
import Dexie, { Table } from 'dexie';

// 表单填写存储字段
export interface FormData {
    id: string;
    scenesOne: string;
    scenesTwo: string;
    reasonClass: string;
    subReasonClass: string;
    reasonDesc: string;
    problemCell: string;
    customerFeedback: string;
    disapprovalReason: string;
    isUserOnsite: string;
    absenceReasons: string;
    additionalInfo: string;
    otherTips: string;
    otherAmount: string;
    nowTime: string;
    lng: string;
    lat: string;
    feePhotoArray: Array<any>;
    feeUrlStr: string;
    queueIploadFile: Array<any>;
}

// 方案制定存储字段
export interface PlanData {
    id: string;
    selectSolutionValue: string;
    solutionDesc: string;
    selectTimeValue: string;
}

// 一键测试存储字段

export interface TestData {
    id: any;
    itemChecked: Array<any>;
    httpTestResult: Array<any>;
    httpTestInfo: object;
    httpTestStatus: number;
    phoneTestStatus: number;
    phoneTestResult: Array<any>;
    FtpTestStatus: number;
    ftpUploadTestResult: Array<any>;
    ftpTestDownResult: Array<any>;
    coverTestTime: number;
    coverTestStatus: number;
    netWorkType: string;
    adjacentList: Array<any>;
    currentTrack: Array<any>;
    selectLocation: string;
    selectDot: string;
}

// 拍照存储数据
export interface PhotoData {
    id: string;
    nowTime: string;
    address: string;
    getSignLng: number;
    getSignLat: number;
    outerImageArray: Array<any>;
    innerImageArray: Array<any>;
    otherImageArray: Array<any>;
    queueIploadFile: Array<any>;
}

export class MySubClassedDexie extends Dexie {
    formDB!: Table<FormData>;
    PlanDB!: Table<PlanData>;
    testDB!: Table<TestData>;
    photoDB!: Table<PhotoData>;

    constructor() {
        super('myDatabase');
        this.version(1).stores({
            formDB: 'id, scenesOne, scenesTwo, reasonClass, subReasonClass, reasonDesc, problemCell, customerFeedback, disapprovalReason, isUserOnsite, absenceReasons, additionalInfo, otherTips, otherAmount, nowTime, lng, lat, feePhotoArray, feeUrlStr',
            PlanDB: 'id, selectSolutionValue, solutionDesc, selectTimeValue',
            testDB: 'id, itemChecked, httpTestResult, httpTestInfo,httpTestStatus,phoneTestStatus,phoneTestResult,FtpTestStatus,ftpUploadTestResult,ftpTestDownResult,coverTestTime,coverTestStatus,netWorkType, adjacentList,currentTrack,selectLocation,selectDot',
            photoDB: 'id,nowTime,address,getSignLng,getSignLat,outerImageArray,innerImageArray,otherImageArray,queueIploadFile'
        });
    }
}

export const db = new MySubClassedDexie();
  • 在组件中实现,用于保存在本地草稿
	private async openIDB() {
		const routerParam: any = this.$route.params;
		const id = routerParam.id || routerParam?.item['工单编号'];
		// 增加数据
		const params = {
			id: id,
			selectSolutionValue: this.selectSolutionValue,
			solutionDesc: this.solutionDesc,
			selectTimeValue: this.selectTimeValue
		};
		const cur = await db.PlanDB.get(id);
		if (cur) {
			db.PlanDB.put(params);
		} else {
			db.PlanDB.add(params);
		}

		Toast.succeed('草稿已保存');
	}
  • 当数据提交成功时,需要删除本地缓存的数据
// 清除缓存数据
				db.PlanDB.get(id).then((item: any) => {
					if (item) {
						db.PlanDB.get(id).then((result: any) => {
							if (result.id) {
								db.PlanDB.delete(id);
							}
						});
					}
				});
  • 当进入页面的时候,获取本地缓存数据,展示在页面
private getLocalData() {
		const routerParam: any = this.$route.params;
		const id = routerParam.id || routerParam?.item['工单编号'];
		db.PlanDB.get(id).then((res: any) => {
			if (res) {
				const data = res;
				this.solutionDesc = data.solutionDesc;
				this.selectSolutionValue = data.selectSolutionValue;
				this.selectTimeValue = data.selectTimeValue;
			}
		});
	}

注意:读取数据、新增数据都是异步的,promise封装好的。
项目效果:
在这里插入图片描述
参考链接:
https://dexie.org/docs/Tutorial/Vue

赶紧用起来吧。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IndexedDB 数据库的使用 的相关文章

  • IndexedDB - DataError:提供给操作的数据不符合要求

    我看过其他类似的问题 我的情况有所不同 因为我插入的是简单的 json 对象 没有键 没有自动增量 这是执行插入的部分 function insertInto model data successCallback console log i
  • IndexedDB 事务和 Promise 之间的相互作用不一致

    I saw 同步承诺发布在 Reddit 和与作者进行了讨论 我们注意到 IndexedDB 事务和 Promise 之间的关系存在一些奇怪的不一致 IndexedDB 事务在所有情况下自动提交onsuccess活动结束 一个复杂的问题是你
  • 如何检查indexedDB实例是否打开?

    假设我有一个 indexedDB 对象的实例 有没有一种简单的方法来检测对象当前是否处于 打开 状态 我试过了database closePending并查看其他属性 但没有看到一个简单的属性来告诉我数据库的状态 我希望同步执行此操作 尝试
  • 获取 IndexedDB 中添加记录的键

    我在 IndexedDB 中有这段代码 var request objectStore add entryType entryType entryDate t 现在我想知道刚刚添加的这条记录的密钥 我该怎么做 I found 本文 和这个
  • 删除方法不适用于 Indexed DB HTML5...它返回成功但记录未删除

    我在使用桌面 Chrome 时遇到的 HTML5 Indexed DB 的另一个问题是我无法从对象存储中删除记录 onsuccess 事件被触发 但记录仍然存在 我的 ID 是一个时间戳 只是因为我想更快地实现一个工作应用程序 我硬编码了它
  • 从 HTML5 存储打开 PDF

    我想将 pdf 文件客户端存储在 HTML5 存储之一 indexedDB 或 localstorage 中 然后稍后使用 adobe reader 打开它们 场景如下 用户访问了我的网站并将一堆 pdf 下载到存储中 稍后 用户重新访问该
  • 使用 create-react-app 添加更多 service-worker 功能

    因此 create react app 包含 Service Worker 功能默认情况下 https github com facebookincubator create react app blob master packages r
  • 为离线Web应用程序存储图像数据(客户端存储数据库)

    我有一个使用 appcaching 的离线 Web 应用程序 我需要提供大约 10MB 20MB 的数据 它将保存 客户端 主要由 PNG 图像文件组成 操作如下 Web 应用程序下载并安装在 appcache 中 使用清单 Web 应用程
  • 当indexedDB被阻止时应用程序应该如何反应

    我在另一个地方被告知question https stackoverflow com questions 39997018关于检测阻止和解除阻止事件 阻止的打开 或删除 不会被取消 只是 被阻止 一旦解除阻止 打开 或删除 将继续 我想知道
  • 本地数据库 API - 已弃用 有什么替代方案? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 获取 Dexie 中的 GroupBy 计数

    我有一个索引数据库下表接受以下结构化 JSON 作为一行 id 1 name doc1 createdDate 2018 08 08 我想计算表中每个可用日期的数量 IE groupby 日期然后计数 预期示例输出的格式为 2018 08
  • 在 IE 10 中使用复合键创建索引时出现 DataError

    我正在使用 IE10 测试基于 indexedDB 的应用程序 我无法创建具有多个键的对象存储 例如 var objectStore theDb createObjectStore store1 keyPath key1 key2 当我尝试
  • 来自 Android 版 IndexedDB Chrome 中保存的块的 HTML5 视频

    我想使用 IndexedDB 在客户端存储离线 HTML5 应用程序的视频文件 为此 我从服务器 API 中下载了 2 个块的视频 然后我将它们作为 blob 存储在 indexedDB 中 然后在其他页面上我从数据库获取它们并创建新的 b
  • 为什么连接到indexedDB时,有时会在onupgradeneeded之前调用onsuccess?

    我在使用 IndexedDB 时遇到问题 在 Firefox 18 上 当我创建新数据库时 onsuccess方法同时被调用有onupgradeneeded 在 Chrome 24 上 这是我想要的行为 onsuccess方法仅在之后调用o
  • IndexedDB - 什么是 Key、keyPath 和 indexName?

    我来自MySQL 习惯了传统的数据库表方案 我无法理解 IndexedDB 及其一些术语 我在文档中查找了这些定义 Key一种数据值 通过它在对象存储中组织和检索存储的值 索引名称要创建的索引的名称 keyPath要使用的索引的键路径 基本
  • 如何在 IndexedDB 中进行 JOIN 类型查询

    我尝试按照以下教程进行操作http hacks mozilla org 2010 06 comparing indexeddb and webdatabase http hacks mozilla org 2010 06 comparing
  • 删除indexedDB对象存储中特定索引值的所有记录

    对于数组键为的对象存储 a b where a也是一个索引 有没有更有效的方法来删除特定值的所有记录a而不是在索引上打开游标a并通过光标逐步删除每条记录 有没有办法只为索引定义键范围 或者只为索引定义键范围a然后离开b打开任何值 以便可以删
  • Ajax IndexedDB 删除当前成功上传

    我昨天发布了类似的内容 但它有效 但只删除了数据中的最后一个对象 我想要发生什么 这个ajax上传将处理大量数据 所以我使用indexeddb 这也将在手机上使用 因此 我希望它一次上传一项 如果一项失败 则仅删除数据中的前一项 这样他们就
  • 将图像文件存储在 IndexedDB 中

    我在尝试将图像文件存储在 IndexedDB 中时遇到问题 我抓取文件对象并尝试将其推送到 IndexedDB 中 但它似乎抛出错误 DOM Exception DATA CLONE ERR 25 如何将如下所示的文件对象转换为可以存储在
  • Metro IndexedDB,浏览数据库

    我正在尝试使用 IndexedDB 将数据存储在 Windows 8 的 Metro 应用程序中 我希望能够浏览数据库 以监视我的操作是否按预期修改数据 所以我的问题是 有没有办法查看地铁应用程序 IE10 的实际数据库 类似于 Chrom

随机推荐

  • 使用cas-overlay-template 6.2服务部署到整合cas-client

    1 什么sso是单点登录 单点登录 xff08 Single Sign On xff09 xff0c 简称为 SSO xff0c 是比较流行的企业业务整合的解决方案之一 SSO的定义是在多个应用系统中 xff0c 用户只需要登录一次就可以访
  • 单例模式-双重锁

    public class Singleton private static volatile Singleton singleton volatile 相当于防止下面两个 61 61 null 判断不被打乱 private Singleto
  • 基于STM32的12864液晶理解

    前言 字符型液晶显示模块是一种专门用于显示字母 数字 符号等点阵式 LCD xff0c 目前常用 161 xff0c 162 xff0c 202 和 402 行等的模块 上面指的是以字符为单位 xff0c 如161 xff0c 也就是1行1
  • Django rest-framework类视图大全

    视图分类 视图类 GenericAPIView xff1a 包含两大视图类 xff08 APIView GenericAPIView xff09 视图工具类 mixins xff1a 包含五大工具类 xff0c 六大工具方法工具视图类 ge
  • JS中? ?和??=和?.和 ||的区别

    undefined和null是两个比较特殊的数据类型 是不能用点操作符去访问属性的 xff0c 否则将会报错 let a console log a name undefined console log a name 报错 let obj
  • 几款好用的串口和网络调试助手

    和嵌入式厮混在一起总得用几个趁手的调试助手 xff0c 这里介绍几个用过的串口和网络调试助手 xff0c 各有千秋 这也只是我自己使用过的 xff0c 如果又更好 xff0c 也请大家分享一下 xff1a 1 丁丁串口调试助手 这是我最常用
  • 软件设计工程——结构化分析与设计

    结构化分析方法 数据流图 便于用户理解 分析系统数据流程的图形工具 基本图形元素 数据流 xff1a 由固定成分的数据组成 xff0c 表示数据的流向 xff1b 加工 xff1a 描述输入数据流到输出数据流之间的变换 xff1b 数据存储
  • Java面试:接口(Interface)与抽象类(Abstract Class)的区别?

    什么是抽象类 xff1f 包含抽象方法的类 xff0c 是对一系列看上去不同 xff0c 但是本质上相同的具体概念的抽象 抽象类的作用 xff1f 用于拓展对象的行为功能 xff0c 一个抽象类可以有任意个可能的具体实现方式 抽象方法是一种
  • 解决Win10/11有线网(包括校园网)频繁掉线问题

    我连的是校园有线网 xff0c 但以下方法应该能够同时解决wifi出现频繁断连 默认网关不可用的问题 从去年开始我的电脑就有校园网断开的问题 xff0c 但不频繁 xff0c 当时没太在意 xff0c 但今年开学这个问题忽然严重 xff0c
  • python数据分析-Mysql8.0版本用sqlyog连接1251错误解决

    用sqlyog连接8 0 23版本的mysql发生1251错误 下载8 0版本的mysql时候发现最好直接下载 msi的安装文件 xff0c 方便许多 xff0c 好 xff0c 接下来说问题 因为之前装的是5 5版本的 xff0c 但是t
  • 怎么在android中创建raw文件

    怎么在android中创建raw文件 标题 1 2 3 这样即可以
  • form表单中把星号*去掉

    只需要把required true去掉就好了 关于表单验证中会有许多的细节问题需要注意 写法有很多种 注意格式 还有一点 xff0c 如果验证方法是写在行内 xff0c 那么他的方法需要在methods种写
  • 移动端开发的vconsole插件

    vConsole A lightweight extendable front end developer tool for mobile web page 一个轻量级 可扩展的移动网页前端开发工具 是腾讯的一个开源工具 功能 xff1a
  • vite打包工具的介绍

    vite Vite是Vue的作者尤雨溪开发的Web开发构建工具 xff0c 它是一个基于浏览器原生ES模块导入的开发服务器 xff0c 在开发环境下 xff0c 利用浏览器去解析import xff0c 在服务器端按需编译返回 xff0c
  • 初步了解win32界面库DuiLib

    DuiLib是一个开源win32界面库 xff1b 下载地址 xff1a https github com duilib duilib 可以做类似一些杀毒软件的界面 xff1b 效果还是比较好 xff1b 先下载一个demo看一下 xff1
  • this指向 js作用域链

    this 指向 xff5c 作用域与闭包 实战是检验真理的唯一标准深入理解 this作用域闭包到底是什么 this 问题总结 这里将以实战为引子 xff0c 带领大家一起总结出 this 指向问题的规律 默认绑定 xff08 函数直接调用
  • css中zoom和scale

    css中我们常用来缩放的样式元素是transform scale xff1b 也还有我们不熟悉的zoom xff0c 在实际的应用场景中 xff0c 我们需要根据自身项目的需要 xff0c 结合不同的解决方案的优缺点来选择适合我们项目解决方
  • 客户端存储和http缓存

    通过本文学习 xff0c 将获得以下知识 xff1a 1 web 端存储有哪些方式 2 不同存储之间的区别 xff0c 以及使用场景 3 http缓存有哪些策略 web 存储的由来 为什么需要 web 存储呢 xff0c 也就是客户端存储
  • 将React 类组件转换成 函数式组件

    将React 类组件转换成 函数式组件 步骤 xff1a 将class 类定义的React 元素转换成 变量或者函数class 中的 render 函数 直接去掉 xff0c 直接return html 元素将 state 变量使用 use
  • IndexedDB 数据库的使用

    前端的存储方式 前端的存储 xff0c 可以使得页面交互更加友好 xff0c 特别是在保存草稿 xff0c 网络差的情况下对用户来说是很有用的 前端的存储方式有多种 xff0c 像 Local storage Session storage