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

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

时间:2024-11-30 10:05:12浏览次数:4  
标签:IndexedDB const request 数据库 db 模块 封装 event

1. IndexedDB简介

IndexedDB 是一种在浏览器中存储结构化数据的方式,类似于关系数据库,但它具有更高的存储容量和灵活性。相比于 localStorageIndexedDB 适合存储大量数据,能够处理更复杂的数据结构,并且支持异步操作。它是浏览器端持久化存储的一种常用方式。

IndexedDB的特点:

  • 异步IndexedDB 操作大多数是异步的,因此不会阻塞 UI 线程。
  • 存储数据结构:能够存储 JavaScript 对象,包括数组、对象等结构化数据。
  • 大容量:浏览器的存储限制较高,通常比 localStorage 高得多(大多数浏览器在单个域名下允许存储 50MB 以上的数据)。
  • 事务支持:支持事务,使得对数据库的读写操作具有原子性。
  • 索引:可以为数据创建索引,提高检索效率。

IndexedDB的常见操作:

  • 打开数据库:通过 indexedDB.open() 打开(或者创建)数据库。
  • 创建对象存储(Object Store):相当于数据库表,用来存储实际的数据。
  • 事务(Transaction):所有的操作都在事务中进行,确保数据一致性。
  • 数据存取:支持 getputdelete 等操作。
  • 索引(Index):可以为数据创建索引,便于按字段查找数据。

2. 封装 IndexedDB 的模块代码

为了简化 IndexedDB 的使用,我们可以创建一些封装函数,以便于更容易地进行数据库操作。以下是一个简单的封装模块,提供了常见的 IndexedDB 操作,如打开数据库、保存数据、获取数据等。

indexedDB.js 模块:

// 打开或创建数据库
export const openDB = (dbName, storeName) => {
    return new Promise((resolve, reject) => {
        const request = indexedDB.open(dbName, 1); // 打开数据库,版本号设置为1

        // 数据库首次创建时或版本升级时会触发
        request.onupgradeneeded = (event) => {
            const db = event.target.result;
            // 如果数据库中没有这个对象存储,则创建它
            if (!db.objectStoreNames.contains(storeName)) {
                const store = db.createObjectStore(storeName, { keyPath: 'id' }); // 使用 'id' 作为主键
                store.createIndex('treeIndex', 'tree'); // 为 'tree' 字段创建索引
            }
        };

        // 数据库打开成功
        request.onsuccess = (event) => {
            resolve(event.target.result);
        };

        // 打开失败
        request.onerror = (event) => {
            reject('数据库打开失败: ' + event.target.errorCode);
        };
    });
};

// 保存数据到数据库
export const saveToDB = (db, storeName, data) => {
    return new Promise((resolve, reject) => {
        const transaction = db.transaction(storeName, 'readwrite'); // 以读写模式打开事务
        const store = transaction.objectStore(storeName);
        const request = store.put(data); // 插入或更新数据

        request.onsuccess = () => {
            resolve('数据保存成功');
        };

        request.onerror = (event) => {
            reject('数据保存失败: ' + event.target.errorCode);
        };
    });
};

// 从数据库中获取数据
export const getFromDB = (db, storeName, id) => {
    return new Promise((resolve, reject) => {
        const transaction = db.transaction(storeName, 'readonly'); // 以只读模式打开事务
        const store = transaction.objectStore(storeName);
        const request = store.get(id); // 根据ID获取数据

        request.onsuccess = (event) => {
            resolve(event.target.result); // 返回获取到的结果
        };

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

// 删除数据库中的数据
export const deleteFromDB = (db, storeName, id) => {
    return new Promise((resolve, reject) => {
        const transaction = db.transaction(storeName, 'readwrite');
        const store = transaction.objectStore(storeName);
        const request = store.delete(id); // 根据ID删除数据

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

        request.onerror = (event) => {
            reject('数据删除失败: ' + event.target.errorCode);
        };
    });
};

3. 使用示例

初始化数据库:

const [db, setDb] = useState(null);

useEffect(() => {
    const initDB = async () => {
        const database = await openDB('CubeDataDB', 'treeStore');
        setDb(database);
    };
    initDB();
}, []);

获取数据:

const getSavedTreeState = async () => {
    if (db) {
        try {
            const savedState = await getFromDB(db, 'treeStore', queryUuid);
            return savedState ? savedState.tree : cubeStructTree;
        } catch (e) {
            console.error('Failed to get tree state from IndexedDB', e);
            return cubeStructTree;
        }
    }
    return cubeStructTree;
};

保存数据:

const saveTreeState = async (updatedTree) => {
    if (db) {
        try {
            await saveToDB(db, 'treeStore', { id: queryUuid, tree: updatedTree });
            console.log('Tree state saved to IndexedDB');
        } catch (e) {
            console.error('Failed to save tree state to IndexedDB', e);
        }
    }
};

删除数据:

const deleteSavedState = async () => {
    if (db) {
        try {
            await deleteFromDB(db, 'treeStore', queryUuid);
            console.log('Tree state deleted from IndexedDB');
        } catch (e) {
            console.error('Failed to delete tree state from IndexedDB', e);
        }
    }
};

4. 总结

  • IndexedDB 提供了一个浏览器端的数据库,能够处理大量数据并提供异步接口。
  • 我们封装了几个常用的 IndexedDB 操作,包括打开数据库、保存数据、获取数据和删除数据。
  • 在 React 中,通过 useEffect 打开数据库,并使用封装函数进行数据存取。

通过这种封装方式,你可以方便地在 React 项目中使用 IndexedDB 存储数据,避免了 localStorage 的存储限制,同时支持更复杂的数据结构。

标签:IndexedDB,const,request,数据库,db,模块,封装,event
From: https://www.cnblogs.com/Tifahfyf/p/18578074

相关文章

  • 基于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.模块化概述什么是模块化?将程序文件依据一定规则拆分成多个文件,这种编码方式就是模块化的编码方式拆分出来的每个文件就是一个模块,模块中的数据都是私有的,模块之间相互隔离同时也能通过一些手段,可以把模块内的指定数据“交出去”,供其他模块使用......
  • JS怎么实现Module模块化?
    在JavaScript中实现模块化主要有两种方式:CommonJS和ES6模块。以下是这两种方法的基本实现:CommonJSCommonJS是Node.js的原生模块系统,但它也可以在浏览器环境中使用通过构建工具如Webpack或Browserify。模块导出://myModule.jsmodule.exports={myFunction:function(......
  • Taro 小程序基于eventCenter封装的消息监听
    基于eventCenter封装的工具类,方便快捷监听和是释放事件importTarofrom'@tarojs/taro'classEventBusManager{constructor(){if(!EventBusManager.instance){this._eventCenter=Taro.eventCenterEventBusManager.instance=t......
  • django中admin模块中修改密码的form
    django中admin模块中修改密码的form,参考这个文件在E:\django5env\Lib\site-packages\django\contrib\auth\forms.py,其中写了好几个关于form的,可以参考其验证、错误信息等方法classPasswordChangeForm(SetPasswordForm):"""Aformthatletsauserchangetheirp......