indexDB入门到精通,indexdb增删查改,封装indexdb类库,indexdb基本使用

indexDB入门到精通,indexdb增删查改,封装indexdb类库,indexdb基本使用indexdb 入门操作指南 indexdb 入门到精通 indexdb 封装类库 indexdb 的基本使用 超大容量的存储 indexdb 简单使用 web 端的数据库 web 端的大容量存储 优化浏览器加载资源速度

目录

前言

一、直接上代码更看结果更直观

第一步:准备环境和基本的html页面

 第二步:打开数据库(如果没有自动创建)

  第三步:存入一个helloWorld

 第四步:封装删除,查询,修改方法并分别执行查看结果

二、封装indexDB库,

 第一步:封装类库

第二步:使用类库,该库的使用方法如下

三、使用第三方类库


前言

由于开发3D可视化项目经常用到模型,而一个模型通常是几m甚至是几十m的大小对于一般的服务器来讲加载速度真的十分的慢,为了解决这个加载速度的问题,我想到了几个本地存储的。

首先是cookie,cookie肯定是不行的,因为最多以只能存4k,

其次localStorage,最多能存5m,相对于cookie已经打了很多了。但是当遇到大模型还是不够,实际开发中大部分模型都是10m-30m的。

经过网上的相关资料的搜索了解到了indexDB,indexD就正好合适了,因为我发现我常用的3d框架three.js他们也是使用indexDB去做存储,而且存储大小是250m以上(受计算机硬件和浏览器厂商的限制)。

一、直接上代码更看结果更直观

懒人直接看入门的全部代码

 
    
     
     Title 
      
       
      
     
   

第一步:准备环境和基本的html页面

这里需要一个服务器容器打开页面,我这里使用webstrom自带的,路径地址要是有ip地址或者localhost加端口好的格式,

indexDB入门到精通,indexdb增删查改,封装indexdb类库,indexdb基本使用

 基本的html代码

 
     
     Title 
      
     
   

 第二步:打开数据库(如果没有自动创建)

 let dbName = 'helloIndexDB', version = 1, storeName = 'helloStore' let indexedDB = window.indexedDB let db const request = indexedDB.open(dbName, version) request.onsuccess = function(event) { db = event.target.result // 数据库对象 console.log('数据库打开成功') } request.onerror = function(event) { console.log('数据库打开报错') } request.onupgradeneeded = function(event) { // 数据库创建或升级的时候会触发 console.log('onupgradeneeded') db = event.target.result // 数据库对象 let objectStore if (!db.objectStoreNames.contains(storeName)) { objectStore = db.createObjectStore(storeName, { keyPath: 'id' }) // 创建表 // objectStore.createIndex('name', 'name', { unique: true }) // 创建索引 可以让你搜索任意字段 } }

运行如上面的代码后打开控制台可以看到如下效果,数据库已经创建完成了,此时什么数据都没有

indexDB入门到精通,indexdb增删查改,封装indexdb类库,indexdb基本使用

  第三步:存入一个helloWorld

 // 添加数据 function addData(db, storeName, data) { let request = db.transaction([storeName], 'readwrite') // 事务对象 指定表格名称和操作模式("只读"或"读写") .objectStore(storeName) // 仓库对象 .add(data) request.onsuccess = function(event) { console.log('数据写入成功') } request.onerror = function(event) { console.log('数据写入失败') throw new Error(event.target.error) } } // 由于打开indexDB是异步的加个定时器避免 db对象还没获取到值导致 报错 setTimeout(() => { addData(db, storeName, { id: new Date().getTime(), // 必须且值唯一 name: '张三', age: 18, desc: 'helloWord' }) }, 1000)

刷新页面后可以看到如下结果,此时我这里已经存进去了,(我刷新了两次所以有两条数据)

indexDB入门到精通,indexdb增删查改,封装indexdb类库,indexdb基本使用

 第四步:封装删除,查询,修改方法并分别执行查看结果

 // 根据id获取数据 function getDataByKey(db, storeName, key) { let transaction = db.transaction([storeName]) // 事务 let objectStore = transaction.objectStore(storeName) // 仓库对象 let request = objectStore.get(key) request.onerror = function(event) { console.log('事务失败') } request.onsuccess = function(event) { console.log('主键查询结果: ', request.result) } } // 根据id修改数 function updateDB(db, storeName, data) { let request = db.transaction([storeName], 'readwrite') // 事务对象 .objectStore(storeName) // 仓库对象 .put(data) request.onsuccess = function() { console.log('数据更新成功') } request.onerror = function() { console.log('数据更新失败') } } // 根据id删除数据 function deleteDB(db, storeName, id) { let request = db.transaction([storeName], 'readwrite').objectStore(storeName).delete(id) request.onsuccess = function() { console.log('数据删除成功') } request.onerror = function() { console.log('数据删除失败') } } // 由于打开indexDB是异步的加个定时器避免 db对象还没获取到值导致 报错 setTimeout(() => { // addData(db, storeName, { // id: new Date().getTime(), // 必须且值唯一 // name: '张三', // age: 18, // desc: 'helloWord' // }) getDataByKey(db, storeName, 08) updateDB(db, storeName, {id: 84, desc: '修改的内容'}) deleteDB(db, storeName, 39) }, 1000)

执行上面的代码后结果后,我这边的结果如下,

indexDB入门到精通,indexdb增删查改,封装indexdb类库,indexdb基本使用

二、封装indexDB库,

在实际开发过程中我们并不会直接使用原生的indexDB一般都会封装好一个库直接使用,下面是我封装好的一个比较常用的库,给大家参考。

 第一步:封装类库

/ * 封装的方法以及用法 * 打开数据库 */ export function openDB(dbName, storeName, version = 1) { return new Promise((resolve, reject) => { let indexedDB = window.indexedDB let db const request = indexedDB.open(dbName, version) request.onsuccess = function(event) { db = event.target.result // 数据库对象 resolve(db) } request.onerror = function(event) { reject(event) } request.onupgradeneeded = function(event) { // 数据库创建或升级的时候会触发 console.log('onupgradeneeded') db = event.target.result // 数据库对象 let objectStore if (!db.objectStoreNames.contains(storeName)) { objectStore = db.createObjectStore(storeName, { keyPath: 'id' }) // 创建表 // objectStore.createIndex('name', 'name', { unique: true }) // 创建索引 可以让你搜索任意字段 } } }) } / * 新增数据 */ export function addData(db, storeName, data) { return new Promise((resolve, reject) => { let request = db.transaction([storeName], 'readwrite') // 事务对象 指定表格名称和操作模式("只读"或"读写") .objectStore(storeName) // 仓库对象 .add(data) request.onsuccess = function(event) { resolve(event) } request.onerror = function(event) { throw new Error(event.target.error) reject(event) } }) } / * 通过主键读取数据 */ export function getDataByKey(db, storeName, key) { return new Promise((resolve, reject) => { let transaction = db.transaction([storeName]) // 事务 let objectStore = transaction.objectStore(storeName) // 仓库对象 let request = objectStore.get(key) request.onerror = function(event) { reject(event) } request.onsuccess = function(event) { resolve(request.result) } }) } / * 通过游标读取数据 */ export function cursorGetData(db, storeName) { let list = [] let store = db.transaction(storeName, 'readwrite') // 事务 .objectStore(storeName) // 仓库对象 let request = store.openCursor() // 指针对象 return new Promise((resolve, reject) => { request.onsuccess = function(e) { let cursor = e.target.result if (cursor) { // 必须要检查 list.push(cursor.value) cursor.continue() // 遍历了存储对象中的所有内容 } else { resolve(list) } } request.onerror = function(e) { reject(e) } }) } / * 通过索引读取数据 */ export function getDataByIndex(db, storeName, indexName, indexValue) { let store = db.transaction(storeName, 'readwrite').objectStore(storeName) let request = store.index(indexName).get(indexValue) return new Promise((resolve, reject) => { request.onerror = function(e) { reject(e) } request.onsuccess = function(e) { resolve(e.target.result) } }) } / * 通过索引和游标查询记录 */ export function cursorGetDataByIndex(db, storeName, indexName, indexValue) { let list = [] let store = db.transaction(storeName, 'readwrite').objectStore(storeName) // 仓库对象 let request = store.index(indexName) // 索引对象 .openCursor(IDBKeyRange.only(indexValue)) // 指针对象 return new Promise((resolve, reject) => { request.onsuccess = function(e) { let cursor = e.target.result if (cursor) { list.push(cursor.value) cursor.continue() // 遍历了存储对象中的所有内容 } else { resolve(list) } } request.onerror = function(ev) { reject(ev) } }) } / * 更新数据 */ export function updateDB(db, storeName, data) { let request = db.transaction([storeName], 'readwrite') // 事务对象 .objectStore(storeName) // 仓库对象 .put(data) return new Promise((resolve, reject) => { request.onsuccess = function(ev) { resolve(ev) } request.onerror = function(ev) { resolve(ev) } }) } / * 删除数据 */ export function deleteDB(db, storeName, id) { let request = db.transaction([storeName], 'readwrite').objectStore(storeName).delete(id) return new Promise((resolve, reject) => { request.onsuccess = function(ev) { resolve(ev) } request.onerror = function(ev) { resolve(ev) } }) } / * 删除数据库 */ export function deleteDBAll(dbName) { console.log(dbName) let deleteRequest = window.indexedDB.deleteDatabase(dbName) return new Promise((resolve, reject) => { deleteRequest.onerror = function(event) { console.log('删除失败') } deleteRequest.onsuccess = function(event) { console.log('删除成功') } }) } / * 关闭数据库 */ export function closeDB(db) { db.close() console.log('数据库已关闭') } export default { openDB, addData, getDataByKey, cursorGetData, getDataByIndex, cursorGetDataByIndex, updateDB, deleteDB, deleteDBAll, closeDB } 

第二步:使用类库,该库的使用方法如下

 
    
     
     Title 
     
       注意要加 type="module" 
        
      
     
   

三、使用indexdb第三方类库indexdbwrapper(这种方式需要懂得使用打包工具开发不懂跳过)

/* 下载 cnpm install --save indexdbwrapper */ // 引入 import IndexDBWrapper from 'indexdbwrapper' // 使用 async function dbTest() { const dbName = 'dbName', storeName = 'storeName', version = 1 const db = new IndexDBWrapper(dbName, version, { onupgradeneeded(event) { const db = event.target.result // 数据库对象 let objectStore if (!db.objectStoreNames.contains(storeName)) { objectStore = db.createObjectStore(storeName, { keyPath: 'id' }) // 创建表 // objectStore.createIndex('createTime', 'createTime', { unique: false }) // 创建索引 可以让你搜索任意字段 } } }) await db.open() await db.add(storeName, { id: new Date().getTime(), updateTime: new Date().getTime() }) console.log(await db.get(storeName, 40)) console.log(await db.put(storeName, { id: 40, put: 'put2' })) console.log(await db.get(storeName, 40)) console.log(await db.delete(storeName, 40)) // console.log(await db.clear(storeName)) } dbTest()

更多相关的indexdbwrapper 相关的教程请看 https://www.npmjs.com/package/indexdbwrapper

未完待续。。。。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/211067.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午11:16
下一篇 2026年3月18日 下午11:17


相关推荐

  • 常量指针与指针常量

    常量指针与指针常量这两个概念可以说是很容易就在 C 语言中弄混淆了 先列举几个例子 1 constchar p 2 char constp a 3 char p abc 下面是分析 语句 1 中定义了一个常量指针 即指向一个常量的指针 指向的内容是常量 不可修改 放在常量区的 但指针本身可以修改 即 p b 是非法的 p 是 p 指向的常量的第一个字符 是个常量

    2026年3月26日
    2
  • yii报错400

    yii报错400当你在使用yii2.0过程中程序出现400的错误可以在控制器内加入public$enableCsrfValidation=false;即可解决

    2022年6月3日
    38
  • 阅读micropyton源码-添加C扩展类模块(1)

    阅读micropyton源码-添加C扩展类模块(1)阅读 micropyton 源码 添加 C 扩展类模块 1 苏勇 2021 年 8 月文章目录阅读 micropyton 源码 添加 C 扩展类模块 1 Introduction 在 python 内核中注册 machine 模块包含的 Pin 模块小结 Introduction 在前文 为 micropython 添加模块 2 类模块 中 我按照源代码排列的顺序 大体阅读了 micropython 添加 C 扩展模块的编程方式及其源代码 在通读 micropython 源码之后 我认为使用自顶向下的方式阅读和描述这部分更有助于开发者理解和编程 经年之

    2026年3月17日
    2
  • 利用python进行显著性分析

    利用python进行显著性分析利用 python 进行显著性分析实验数据做的是朋友的呃呃植物什么什么实验 相关数据已经打码 最右侧的一列是 spss 的显著性分析的结果代码最终设想是能实现和 SPSS 一样或者近似的结果用到的库是 scipy 用于处理数据 皮尔逊相关系数 scipy 一点点的介绍 pandas 读取 Excel 表 importscipy statsasstats max l 求出最大的数的下标 m 0fori

    2026年3月16日
    1
  • 核酸检测小程序实战教程

    核酸检测小程序实战教程随着疫情进入常态化防控 为了让市民便捷的进行核酸检测 好些城市都出现了核酸检测点 居民可以去离自己最近的核酸检测点 进行扫码登记 核酸做完之后还可以在小程序直接获取报告 非常方便 我们本次教程就以这个实际生活场景为例 结合微搭低代码工具来制作一款核酸检测小程序 小程序一共分为在线预约和我的预约两个版块 在线预约可以增加受检人 选择预约地点 预约日期 我的预约可以查看自己已经生成的报告

    2026年3月17日
    2
  • C调用斑马打印机打印条码标签(含源码)(支持COM、LPT、USB、TCP连接方式和ZPL、EPL、CPCL指令)

    C调用斑马打印机打印条码标签(含源码)(支持COM、LPT、USB、TCP连接方式和ZPL、EPL、CPCL指令)在批量打印商品标签时一般都要加上条码或图片 而这类应用大多是使用斑马打印机 所以我也遇到了怎么打印的问题 一种办法是用标签设计软件做好模板 在标签设计软件中打印 这种办法不用写代码 但对我来说觉得不能接受 所以尝试代码解决问题 网上搜索一番 找不到什么资料 基本都是说发送 ZPL EPL 指令到打印机 而且还是 COM LPT 口连接打印机 后来研究 net 的打印类库 发现是用绘图方式打印至打印机

    2026年3月26日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号