IndexedDB使用案例

这篇具有很好参考价值的文章主要介绍了IndexedDB使用案例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

IndexedDB是一种在浏览器端存储数据的方式,它丰富了客户端的查询方式,由于是本地存储,可以有效减少网络对页面数据的影响。这使得浏览器可以存储更多的数据,从而丰富了浏览器端的应用类型。

IndexedDB与传统的关系型数据库不同,它是一个key-value型的数据库。其中,value可以是复杂的结构体对象,而key可以是对象的某些属性值,也可以是其他的对象(包括二进制对象)。使用对象中的任何属性作为index,可以加快查找速度。此外,IndexedDB是自带transaction的,所有的数据库操作都会绑定到特定的事务上,并且这些事务是自动提交的,IndexedDB并不支持手动提交事务。

IndexedDB是一种NoSQL数据库,面向对象,主要存储的是Javascript对象。而且,IndexedDB的API大部分都是异步的,使用异步方法时,API不会立即返回要查询的数据,而是返回一个callback。

总的来说,IndexedDB为浏览器提供了更强大的数据存储和查询能力,使开发者能够创建更丰富、更复杂的浏览器端应用。
以下是IndexedDB的一个使用案例:

module.exports = {

  dbName: 'dbTest',
  version: 1,
  db: null,
  indexedDB: window.indexedDB || window.webkitIndexedDB,

  // 异步方法改写,包括错误处理的优化
  async openDB() {
    try {
      const request = this.indexedDB.open(this.dbName, this.version);

      // 如果数据库不存在或者版本号更高,触发 onupgradeneeded 事件
      request.onupgradeneeded = (event) => {
        this.db = event.target.result;
        // 确保数据库中已经包含了所有必要的对象存储
        ['mystore', 'mystore01'].forEach(storeName => {
          if (!this.db.objectStoreNames.contains(storeName)) { // 如果没有名为 'mystore' 的对象存储
            this.db.createObjectStore(storeName, { keyPath: 'id' });  // 创建新的对象存储,并设置主键为 'id'
          }
        });
      };

      request.onsuccess = (event) => {
        this.db = event.target.result;
        console.log("Database opened successfully", event.target.result);
      };

      request.onerror = (event) => {
        console.error("Error opening IndexedDB:", event.target.errorCode);
      };
    } catch (error) {
      console.error("Error opening IndexedDB asynchronously:", error);
    }
  },

  // 使用Promise替代回调,优化异步处理
  async addData(myStore, data) {
    try {
      const store = this.getStore(myStore);
      return new Promise((resolve, reject) => {
        const addRequest = store.add(data);
        addRequest.onsuccess = (event) => {
          console.log('添加成功!', event.target.result);
          resolve(event.target.result);
        };
        addRequest.onerror = (event) => {
          console.log('添加失败!', event.target.error);
          reject(event.target.error);
        };
      });
    } catch (error) {
      console.error("Error adding data:", error.name, error.message);
      throw error; // 重新抛出错误,以便调用者可以捕获
    }
  },

  getById(myStore, id) {
    return new Promise((resolve, reject) => {
      const store = this.getStore(myStore);
      const request = store.get(id);
      request.onerror = (event) => {
        console.error('查询数据失败:', event.target.error);
        reject(event.target.error);
      };
      request.onsuccess = (event) => {
        const result = event.target.result;
        console.log('查询数据成功:', result);
        resolve(result);
      };
    });
  },

  // 更新数据方法
  updateById(myStore, data) {
    return this._handleDatabaseRequest(() => {
      const store = this.getStore(myStore);
      return store.put(data);
    }, '更新数据');
  },

  // 删除数据方法
  deleteById(myStore, id) {
    return this._handleDatabaseRequest(() => {
      const store = this.getStore(myStore);
      return store.delete(id);
    }, '删除数据');
  },

  getStore(myStore) {
    if (!this.db) {
      this.openDB(); // 确保数据库已经打开
    }
    if (!this.db.objectStoreNames.contains(myStore)) {
      throw new Error(`Object store ${myStore} does not exist.`);
    }
    const transaction = this.db.transaction(myStore, 'readwrite');
    const store = transaction.objectStore(myStore);
    return store;
  },

  // 私有方法,用于处理数据库请求,减少代码重复
  _handleDatabaseRequest (operation, actionName) {
    try {
      return new Promise((resolve, reject) => {
        const request = operation();
        request.onsuccess = (event) => {
          console.log(`${actionName}成功:`, event.target.result);
          resolve(event.target.result);
        };
        request.onerror = (event) => {
          console.error(`${actionName}失败:`, event.target.error);
          reject(event.target.error);
        };
      });
    } catch (error) {
      console.error(`Error during ${actionName}:`, error.name, error.message);
      throw error;
    }
  }

}

 文章来源地址https://www.toymoban.com/news/detail-840295.html

到了这里,关于IndexedDB使用案例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 什么是无头浏览器?如何使用Golang实现无头浏览器截图?

    什么是无头浏览器?如何使用Golang实现无头浏览器截图?

    在Web开发中,有时需要对网页进行截图,以便进行页面预览、测试等操作。 而使用无头浏览器来实现截图功能,可以避免手动操作的繁琐和不稳定性。 这篇文章将介绍: 使用Golang进行无头浏览器的截图,轻松实现页面预览、测试和模拟用户操作。 这篇文章发完,有朋友在朋

    2024年02月05日
    浏览(9)
  • 基于selenium实现多个脚本只打开一次浏览器(重复使用浏览器)

    本文思路来源【Selenium】控制当前已经打开的 chrome浏览器窗口(高级版)_是小菜欸的博客-CSDN博客 selenium 自动打开Chrome浏览器且重复使用已打开的Chrome实例_飞扬的箭的博客-CSDN博客 但是这一篇文章的方式对于我来说有一个缺点,即每一次都需要新创建一个浏览器,或者需要

    2024年02月16日
    浏览(7)
  • 华为自带浏览器无法使用

    华为自带浏览器无法使用

    一、首先确认其他浏览器是否正常使用 1.Microsoft Edge 页面截图  2、谷歌页面截图 问题所在:Microsoft Edge浏览器版本 111.0.1661.43 (正式版本64 位)兼容性问题。 二、处理方法 1、将Microsoft Edge浏览器卸载,且将C:Program Files (x86)MicrosoftEdge对应残留文件夹目录删除。 2、删除完去华

    2024年02月04日
    浏览(17)
  • QT 浏览器组件使用

    QT 浏览器组件使用

     1. Qt4中使用webkit模块;   2. Qt5 ~Qt5.5使用webkitwidgets模块,使用WebKit作为后端;   3. Qt5.6以上版本使用webenginewidgets模块,使用Chromium作为后端。QT5.6之后开始支持 这里一定要指定msvc2017(或者msvc2019都可以) 64编译器,如果指定minGW依然会报错,因为MinGW不支持QWebEngine,如果QT中msv

    2024年01月22日
    浏览(9)
  • 使用selenium启动谷歌Chrome浏览器打开指定网站,页面空白,而使用其它浏览器手动打开该网站则正常

    在使用python实现自动化网络爬虫时,我使用到selenium来驱动谷歌Chrome浏览器来打开某一个网页,然后爬取数据,当使用Python中的selenium库驱动Chrome浏览器打开特定网站时,页面内容为空白,但在其他浏览器中手动访问该网站则显示正常。

    2024年02月07日
    浏览(42)
  • 使用Postman拦截浏览器请求

    使用Postman拦截浏览器请求

    项目上线之后,难免会有BUG。在出现问题的时候,我们可能需要获取前端页面发送请求的数据,然后在测试环境发送相同的数据将问题复现。手动构建数据是挺麻烦的一件事,所以我们可以借助Postman在浏览器上的插件帮助拦截请求,获取发送的数据。 既然是基于Postman进行操

    2024年02月15日
    浏览(7)
  • 【已解决】使用selenium启动谷歌Chrome浏览器打开指定网站,页面空白,而使用其它浏览器手动打开该网站则正常

    【已解决】使用selenium启动谷歌Chrome浏览器打开指定网站,页面空白,而使用其它浏览器手动打开该网站则正常

    1、在使用python实现自动化网络爬虫时,我使用到selenium来驱动谷歌Chrome浏览器来打开某一个网页,然后爬取数据,代码如下:    2、但是当执行到driver.get(url)访问网站时,页面是空白的,如下所示,没有正常显示该网站的数据    print输出的网页html也只有如下数据: htmlhea

    2024年02月12日
    浏览(88)
  • 火狐浏览器hackbar安装使用教程

    火狐浏览器hackbar安装使用教程

    首先先打开火狐自带的扩展和主题 在搜索框中搜索hackbar 由于hackbar现在收费了,这里直接使用hackbarV2来进行平替。 接下来使用F12或者手动打开web开发者工具。 查看效果 使用的第一步就是先去点击load URL导入URL 通过在框里修改url,然后点击execute按钮进行运行 这里的诸多功能

    2023年04月09日
    浏览(34)
  • 使用代理突破浏览器IP限制

    使用代理突破浏览器IP限制

            主要时了解代理服务器的概念,同时如何突破浏览器IP限制         代理服务器英文全称是Proxy Server,其功能就是代理网络用户去取得网络信息。形象的说:它是网络信息的中转站,特别是它具有一个cache缓存的功能。         我觉得以下这种分类方式非常合理:

    2024年02月11日
    浏览(10)
  • 浏览器使用Notification桌面通知消息推送

    浏览器使用Notification桌面通知消息推送

    了解浏览器桌面通知的使用方法、授权流程以及最佳实践。

    2024年02月12日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包