首页 > 其他分享 >IndexedDB设计及封装

IndexedDB设计及封装

时间:2023-11-21 11:25:44浏览次数:34  
标签:IndexedDB resolve 封装 request tableName db Promise reject 设计

设计思路

固定数据表

  • 键值对表
    用于存储数据库相关的信息
  • 库字段构成表
    储存非固定数据表结构

非固定数据表

通过库字段构成表进行创建或更新

划重点

  • 数据库初始创建或更新后会先触发onupgradeneeded方法,然后再触发onsuccess方法,如果在onupgradeneeded方法中执行了表结构操作的话,onsuccess会在transaction.oncomplete事件处理之后触发,所以在onsuccess方法中去执行增删改一定是在表完整结构基础上不必担心表错误

先上封装的代码

class indexedDBClass {
    db
    tableName
    keyPath
    // 连接数据库
    openDB(dbName) {
        return new Promise((resolve, reject) => {
            const request = indexedDB.open(dbName);
            // 创建或更新成功
            request.onupgradeneeded = (e) => {
                const db = e.target.result;
                this.initDB(db);
            };
            // 连接成功
            request.onsuccess = (e) => {
                resolve(e.target.result);
            };
            // 连接失败
            request.onerror = (e) => {
                reject(e.target.errorCode);
            };
        });
    }
    // 初始化数据库
    initDB(db) {
        this.keyPath = 'id'
        const objStore = db.createObjectStore(this.tableName, { keyPath: 'id' });
        objStore.createIndex('name', 'name', { unique: false })
    }
    // 插入一条数据
    putDataOnce(obj) {
        return new Promise((resolve, reject) => {
            let request = this.db.transaction([this.tableName], 'readwrite').objectStore(this.tableName).put(obj)
            request.onsuccess = function () {
                resolve()
            }
            request.onerror = function () {
                reject()
            }
        })
    }
    // 插入数据
    putData(list) {
        let arr = [].concat(list)
        return new Promise((resolve, reject) => {
            Promise.all(arr.map(v => this.putDataOnce(v)))
                .then(res => {
                    resolve()
                }).catch(err => {
                    reject()

                })
        })
    }
    // 通过主键删除数据
    delDataByKeyPath(keyPath) {
        return new Promise((resolve, reject) => {
            let request = this.db.transaction([this.tableName], 'readwrite').objectStore(this.tableName).delete(keyPath)
            request.onsuccess = function () {
                resolve()
            }
            request.onerror = function () {
                reject()
            }
        })
    }
    // 删除数据
    delData(obj) {
        // 由于只能通过主键删除数据,所以要先根据条件进行查询,后逐条进行删除操作
        return new Promise((resolve, reject) => {
            this.getData(obj).then(res => {
                return Promise.all(res.map(v => this.delDataByKeyPath(v.id)))
            }).then(res => {
                resolve()
            }).catch(err => {
                reject()
            })
        })
    }
    // 获取数据
    getData(obj) {
        const objectStore = this.db.transaction(this.tableName).objectStore(this.tableName);
        let objKeyList = Object.keys(obj)
        return new Promise((resolve, reject) => {
            let arr = []
            objectStore.openCursor().onsuccess = ({ target: { result } }) => {
                if (result) {
                    if (objKeyList.every(v => obj[v] === result.value[v])) {
                        arr.push(result.value)
                    }
                    result.continue();
                } else {
                    resolve(arr)
                }
            }
        })
    }
    // 构造方法
    constructor(tableName, cb, dbName = '***') {
        this.tableName = tableName;
        this.openDB(dbName).then((res) => {
            this.db = res;
            cb()
        });
    }
}

使用的时候先创建数据库表

collegeDB = new indexedDBClass('college', () => {
    // 这里的'college'是表名,数据库名默认为'***',可以传第三个参数更换数据库名
    // 使用数据库的代码都要在这里面运行,不然会出现数据库未链接就使用的情况
    // 获取数据(参数是匹配条件)
    let list = await collegeDB.getData({ name: '张三' })
    // 新增&插入数据(参数是完整的要存储的数据)
    await collegeDB.putData(list)
    // 删除数据(参数是匹配条件)
    await collegeDB.delData({ name: '张三' })
})

整个使用下来给我一种就是把数据存在本地的错觉,而且相当不好用,特别是批量处理相当不友好,对于布尔值的搜索还会报错(所以获取数据变成获取全部数据再用js匹配筛选),个人感觉自己写页面玩一玩就得了,要不是谷歌不支持websql我是真的不想研究这玩意

标签:IndexedDB,resolve,封装,request,tableName,db,Promise,reject,设计
From: https://www.cnblogs.com/dkf717/p/17835473.html

相关文章

  • php提前返回数据,后面代码继续执行封装函数
    /*中断并返回数据,后面程序继续执行,避免用户等待(immediate)*可用于返回值后,继续执行程序,但程序占得所以自由没有释放,一致占用,务必注意,最好给单独脚本执行*@paramstring|array$data字符串或数组,数组将被转换成json字符串*@paramintval$set_ti......
  • 模拟集成电路设计系列博客——4.1.3 一阶Gm-C滤波器
    4.1.3一阶Gm-C滤波器假设我们希望实现如下图所示系统框图的单端\(G_m-C\)滤波器。我们可以使用下图所示的电路:系统框图中的增益通过跨导器来实现,积分通过电容\(C_A\)来实现,而\(C_X\)对应了系统框图中前馈通路\(k_1s\)。上面这个一阶\(G_m-C\)滤波器的传输函数可以通过列写......
  • 算法设计与分析 目录
    学期内是更不动了,之后慢慢填。全源最短路近似斐波那契堆及其应用并查集分析与反阿克曼函数Splay,LCT,ETT动态图连通性网络流最小割与Gomory-Hu树.........
  • 什么是计算机软件设计领域的 Edge Case
    在软件设计领域,EdgeCase(边缘情况)是一个重要的概念。简单来说,EdgeCase是指在系统的输入、操作或使用环境达到一些极限或者特殊情况时的场景。这些场景通常在正常使用条件下不太可能出现,但是如果发生,可能会导致系统行为异常,比如性能下降、功能失效,甚至系统崩溃。因此,在设计和测试......
  • 基于springboot的七彩云南文化旅游网站-计算机毕业设计源码+LW文档
    摘 要传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装七彩云南文化旅游网站软件来发挥其高效地信息处理的作用,可以规范信息管理流程,让管理工作可以系统化和程序化,同时,七彩云南文化旅......
  • 基于springboot的太原学院商铺管理系统-计算机毕业设计源码+LW文档
    摘 要信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容......
  • 基于Springboot的小区疫情购物系统-计算机毕业设计源码+LW文档
    摘 要信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容......
  • 电池充电电路设计注意事项
    电池充电电路设计注意事项一、引言随着电子设备的普及和应用,电池已经成为这些设备的重要能源之一。而电池充电电路则是电池管理系统中不可或缺的一部分。一个好的电池充电电路不仅可以提高电池的充电效率,还可以延长电池的使用寿命和保障使用安全。因此,本文将介绍电池充电电路设计时......
  • 高斯数据库HCNA之数据库设计基础
    一、数据库设计概述数据库设计是根据数据库系统的特点,针对具体的应用对象构建适合的数据库模式,建立数据库及相应的应用,使整个系统能有效的采集,存储,处理和管理,从而满足企业中各种用户的使用需求本章主要介绍了数据库设计的相关概念,整体目标和需要解决的问题,并按照新奥尔良设计方......
  • 基于Springboot宠物商城网站系统-计算机毕业设计源码+LW文档
    摘 要如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统宠物商城网站系统信息管理难度大,容错率低,管理人员处理数据费工费时,所以专门为解决这个难题开发了一个宠物商城网......