首页 > 其他分享 >介绍一下IndexedDB以及封装IndexedDB的模块代码

介绍一下IndexedDB以及封装IndexedDB的模块代码

时间:2024-11-30 13:54:54浏览次数:5  
标签:IndexedDB 封装 db objectStore request 模块 const event

IndexedDB 简介

IndexedDB 是一种浏览器内置的低层次的 API,用于在客户端存储大量结构化数据。它是一个浏览器端的数据库,允许你存储各种类型的对象,包括文件、二进制数据等,并通过键值对的方式进行快速查询。与 Web Storage(如 localStoragesessionStorage)不同,IndexedDB 可以存储大量数据并提供更丰富的查询能力,尤其适用于需要在客户端持久化存储复杂数据(如应用离线工作,或存储大量用户数据)的场景。

IndexedDB 通过对象存储(object stores)和索引(indexes)来进行数据存储和检索。对象存储可以理解为数据库表,而索引则类似于数据库中的索引,能帮助更快地查询数据。

主要特性

  • 支持大数据量存储:可以存储大量数据,超出 localStorage 的限制。
  • 异步APIIndexedDB 采用异步方式进行操作,避免阻塞主线程。
  • 支持事务:通过事务来保证数据操作的原子性和一致性。
  • 支持键值对存储:每个对象存储可以使用键(key)来快速访问存储的对象。

使用 IndexedDB

IndexedDB 提供了包括 open(), put(), get(), delete() 等方法来进行数据存取。下面是一个简单的使用例子:

// 打开或创建数据库
let db;
const request = indexedDB.open('myDatabase', 1);

// 数据库版本升级时触发
request.onupgradeneeded = function(event) {
    db = event.target.result;
    // 创建对象存储,类似数据库表
    const objectStore = db.createObjectStore('users', { keyPath: 'id' });
    objectStore.createIndex('name', 'name', { unique: false });
};

// 打开数据库成功时触发
request.onsuccess = function(event) {
    db = event.target.result;
    console.log('数据库打开成功');
};

// 错误处理
request.onerror = function(event) {
    console.error('数据库打开失败', event);
};

IndexedDB 封装模块代码

为了方便使用 IndexedDB,可以封装一个模块,简化常见的操作,提供统一的接口。以下是一个封装 IndexedDB 操作的例子:

class IndexedDBHelper {
    constructor(dbName, version) {
        this.dbName = dbName;
        this.version = version;
        this.db = null;
        this._openDB();
    }

    // 打开数据库
    _openDB() {
        const request = indexedDB.open(this.dbName, this.version);
        request.onupgradeneeded = (event) => {
            const db = event.target.result;
            // 可以根据需要创建对象存储
            if (!db.objectStoreNames.contains('users')) {
                const objectStore = db.createObjectStore('users', { keyPath: 'id' });
                objectStore.createIndex('name', 'name', { unique: false });
            }
        };

        request.onsuccess = (event) => {
            this.db = event.target.result;
            console.log('数据库连接成功');
        };

        request.onerror = (event) => {
            console.error('数据库打开失败', event);
        };
    }

    // 添加或更新数据
    putData(storeName, data) {
        const transaction = this.db.transaction([storeName], 'readwrite');
        const objectStore = transaction.objectStore(storeName);
        const request = objectStore.put(data);

        request.onsuccess = () => {
            console.log('数据写入成功');
        };

        request.onerror = (event) => {
            console.error('数据写入失败', event);
        };
    }

    // 获取数据
    getData(storeName, key) {
        return new Promise((resolve, reject) => {
            const transaction = this.db.transaction([storeName], 'readonly');
            const objectStore = transaction.objectStore(storeName);
            const request = objectStore.get(key);

            request.onsuccess = (event) => {
                resolve(event.target.result);
            };

            request.onerror = (event) => {
                reject('数据获取失败');
            };
        });
    }

    // 删除数据
    deleteData(storeName, key) {
        const transaction = this.db.transaction([storeName], 'readwrite');
        const objectStore = transaction.objectStore(storeName);
        const request = objectStore.delete(key);

        request.onsuccess = () => {
            console.log('数据删除成功');
        };

        request.onerror = (event) => {
            console.error('数据删除失败', event);
        };
    }

    // 查询所有数据
    getAllData(storeName) {
        return new Promise((resolve, reject) => {
            const transaction = this.db.transaction([storeName], 'readonly');
            const objectStore = transaction.objectStore(storeName);
            const request = objectStore.getAll();

            request.onsuccess = (event) => {
                resolve(event.target.result);
            };

            request.onerror = (event) => {
                reject('获取所有数据失败');
            };
        });
    }
}

// 使用封装好的模块
const dbHelper = new IndexedDBHelper('myDatabase', 1);

// 在数据库打开成功后,执行操作
dbHelper.putData('users', { id: 1, name: 'Alice', age: 25 });

dbHelper.getData('users', 1).then((data) => {
    console.log('获取到的数据:', data);
}).catch((error) => {
    console.error(error);
});

dbHelper.getAllData('users').then((data) => {
    console.log('所有用户数据:', data);
});

代码解析

  1. _openDB():初始化并打开数据库,如果数据库版本有变更则触发 onupgradeneeded,可以在其中创建对象存储和索引。
  2. putData():向数据库中插入或更新数据,如果该键值已存在,则会更新数据。
  3. getData():根据指定的主键获取数据,返回一个 Promise,方便异步处理。
  4. deleteData():根据指定主键删除数据。
  5. getAllData():获取对象存储中的所有数据,同样返回一个 Promise

总结

通过封装 IndexedDB,我们可以更加方便地进行数据存取操作,避免了直接操作底层 API 的复杂性,并且能实现更加灵活和清晰的代码结构。IndexedDB 作为客户端存储的一个重要工具,能帮助开发者在 Web 应用中实现数据的持久化和离线访问。

标签:IndexedDB,封装,db,objectStore,request,模块,const,event
From: https://www.cnblogs.com/Tifahfyf/p/18578324

相关文章

  • 芯洲科技DCDC、LDO、IGBT、MOSFET、功率接口、PMIC、电压模块
    芯洲科技电源管理芯片主要有:降压DCDC转换器、升压DCDC转换器升降压DCDC转换器高压LDO、低压LDO、高性能LDOIGBT/MOSFET栅级驱动器、PWMDCDC控制器、无刷马达驱动器理想二极管控制器、智能高边开关、电子熔断器系统集成:(无线充电发射端PMIC、车载摄像头PMIC、毫米波雷达......
  • 数学模块,turtle模块,time模块
    python模块数学模块turtle模块time模块1.time模块2.格式化数学模块常用数学函数math.sqrt(x):返回x的平方根。如果x是负数,将引发ValueError。math.pow(x,y):返回x的y次幂。等同于x**y,但接受浮点数作为指数。math.exp(x):返回e(自然对数的底数,约等......
  • 介绍一下IndexedDB以及封装IndexedDB的模块代码
    1.IndexedDB简介IndexedDB是一种在浏览器中存储结构化数据的方式,类似于关系数据库,但它具有更高的存储容量和灵活性。相比于localStorage,IndexedDB适合存储大量数据,能够处理更复杂的数据结构,并且支持异步操作。它是浏览器端持久化存储的一种常用方式。IndexedDB的特点:异步:I......
  • 基于FPGA的4ASK调制解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不
    1.算法仿真效果        vivado2019.2仿真结果如下: 设置SNR=20db   设置SNR=15db   设置SNR=10db   2.算法涉及理论知识概要       在现代通信系统中,数字调制技术被广泛应用于无线通信、卫星通信以及有线通信等领域。其中,振幅键控(Ampl......
  • 【Python】“yaml”是什么文件?怎么在代码中封装重要的信息(如账号密码、网址等)?
    我们在写python代码的时候,如果我们把一些账号密码、网址、数据库连接方式暴露在主代码里,很容易给人一眼看代码就暴露出来。所有我们可以做一个小小的封装,可以把一些重要的信息封装起来,运行的时候需要从外部去调用它。这个时候,可以小小地使用一下“yaml”文件1.YAML......
  • Postman的Tests模块
    断言(Assertions):pm.expect:用于断言测试。pm.response.to.have.status(200):断言响应状态码为200。示例:pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});访问响应体:pm.response.json():获取JSON格式的响应体。示例:pm.test......
  • 【深度学习|特征增强融合模块】FeatureAggregationModule (FAM) 双边语义分割模型中的
    【深度学习|特征增强融合模块】FeatureAggregationModule(FAM)双边语义分割模型中的空间语义融合模块升级【深度学习|特征增强融合模块】FeatureAggregationModule(FAM)双边语义分割模型中的空间语义融合模块升级文章目录【深度学习|特征增强融合模块】FeatureAgg......
  • 用js封装一个对cookie操作的方法
    /***Cookie操作工具类*/constCookieUtil={/***设置cookie*@param{string}namecookie名称*@param{string}valuecookie值*@param{Object}options可选参数*-{number}expires过期时间(单位:天)*-{string}path......
  • 【每天一篇深度学习论文】即插即用特征注意力融合模块FFA
    目录论文介绍题目论文地址创新点方法整体结构即插即用模块作用消融实验结果即插即用模块论文介绍题目FFA-Net:FeatureFusionAttentionNetworkforSingleImageDehazing论文地址arxiv.org/pdf/1911.07559创新点特征融合注意力网络(FFA-Net):提出了一种端到......
  • js模块化
    JavaScript模块化规范1.模块化概述什么是模块化?将程序文件依据一定规则拆分成多个文件,这种编码方式就是模块化的编码方式拆分出来的每个文件就是一个模块,模块中的数据都是私有的,模块之间相互隔离同时也能通过一些手段,可以把模块内的指定数据“交出去”,供其他模块使用......