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 数据库的使用 的相关文章

  • HTML5 视频源作为本地存储的 blob 不再工作

    从 Chrome 80 开始 Blob 或 IndexedDB 的工作方式似乎发生了变化 将视频文件作为 blob 加载并通过 createObjectURL 将其分配给 HTML5 Video 元素仍然有效 load the blob t
  • indexedDB 最高键路径

    我在 indexedDB 中有一个使用 Emberjs 适配器填充的数据库 我已经像这样设置了键路径 this addModel App Device keyPath key 当我第一次解析数据时 我的密钥会自动递增 如下所示 data d
  • 如何从indexedDB获取对象存储?

    我在我的应用程序上有用于网络存储的indexedDb 我想通过以下代码获取商店 var store myapp indexedDB db transaction tree nodes readwrite objectStore tree n
  • 进行同步 JavaScript 调用的技巧 [重复]

    这个问题在这里已经有答案了 JavaScript 在大多数现代 API 中使用异步调用来处理磁盘 IO 和网络等 慢 事物 我意识到这样做的目的是什么 但是在某些情况下确实需要进行同步调用 例如 我有一段无法重写的 JavaScript 代
  • 如何通过缓存制作离线地图(使用leaflet OSM)?

    我正在尝试通过浏览器中的缓存 IndexedDB 制作离线地图 我理解的概念是 当连接到互联网时 我首先下载并存储地图的图块 然后我必须逻辑上离线加载图块 但是 我无法弄清楚 如何存储它们以及如何逻辑地再次加载它们 我被困在这里了 我正在使
  • 为离线Web应用程序存储图像数据(客户端存储数据库)

    我有一个使用 appcaching 的离线 Web 应用程序 我需要提供大约 10MB 20MB 的数据 它将保存 客户端 主要由 PNG 图像文件组成 操作如下 Web 应用程序下载并安装在 appcache 中 使用清单 Web 应用程
  • IndexedDB 通过本地 HTML 文件

    我想开发一个使用浏览器与用户交互的应用程序 该应用程序可离线使用并可通过 zip 分发 我想要执行的功能将由 HTML CSS JS 处理 并且我想利用 IndexedDB 功能 我在使用 IndexedDB Chrome 时遇到了一个问题
  • 如何同步访问indexedDB?

    indexedDB 有一个spec https developer mozilla org en IndexedDB Synchronous API说可以同步访问索引数据库 但还没有实现 我只是想知道是否有办法让它手动同步 我的 JavaS
  • 在 Firefox 扩展中使用 indexedDB

    我无法在 Firefox 扩展中使用 indexedDB 保存数据 我也找不到有关 indexedDB 和 Firefox 扩展的任何信息 有人处理过这个吗 唯一的问题是 对于indexedDB您需要一个窗口 除此之外 从附加组件使用它时没
  • 获取 Dexie 中的 GroupBy 计数

    我有一个索引数据库下表接受以下结构化 JSON 作为一行 id 1 name doc1 createdDate 2018 08 08 我想计算表中每个可用日期的数量 IE groupby 日期然后计数 预期示例输出的格式为 2018 08
  • 从 Android 浏览器外部访问 Web Storage 或 IndexedDB

    我想使用 HTML 和 JavaScript 构建一个基于浏览器的离线应用程序来收集 Android 平板电脑上的调查数据 该应用程序将由一些带有表单的静态页面组成 供用户输入数据 然后使用 Web Storage 或 IndexedDB
  • navigator.webkitPersistentStorage.requestQuota 是否适用于 IndexedDB?

    使用今天最新版本的 Android Chrome 我可以使用以下命令请求持久性 IndexedDB 存储吗 navigator webkitPersistentStorage requestQuota var requestedBytes
  • 如何在 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打开任何值 以便可以删
  • 将图像文件存储在 IndexedDB 中

    我在尝试将图像文件存储在 IndexedDB 中时遇到问题 我抓取文件对象并尝试将其推送到 IndexedDB 中 但它似乎抛出错误 DOM Exception DATA CLONE ERR 25 如何将如下所示的文件对象转换为可以存储在
  • 将 SQLite 与 Blazor WASM 结合使用有什么好处?

    我正在看这个Steve Sanderson 的视频演示了如何将 SQLite 与 Blazor Web Assembly 结合使用 https www youtube com watch v kesUNeBZ1Os我正在考虑在我的一个项目中
  • “导航器”类型上不存在属性“存储”

    我正在尝试使用以下命令行从 Angular2 组件获取配额存储信息 navigator storage estimate then data gt console log data 该命令在纯 Javascript 脚本中可以正常工作 但无
  • IndexedDB - 对象存储与多个数据库与索引?

    我想知道什么时候使用单个数据库与具有多个对象存储的数据库是一个好主意 我阅读了网络上的大多数教程并查看了 indexedDB 的规范 但找不到比较这些不同概念的好例子 有没有人有此类事情的具体示例 使用多个对象存储和 或代码的设计模型 只要
  • 如何从事件处理程序返回indexedDB查询结果?

    我必须从indexedDB返回查询结果 但结果只能在onsuccess事件处理程序 1 function listPeople 4 var open indexedDB open AccordionDatabase 1 5 res 6 7
  • Chrome 浏览器的存储限制

    软限制是多少 用户需要授予超过该限制的权限 硬限制是多少 允许的最大值 2020 年 5 月更新 Chrome 现在允许源使用 60 的存储设备空间 真正的细节 存储设备 是包含 chrome 配置文件目录的分区 更新的文章在这里https

随机推荐

  • 使用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