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;
    }
  }

}
  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: IndexedDB 是一种浏览器内置的 NoSQL 数据库,允许您在浏览器中存储和检索数据。下面是一个基本的 IndexedDB 示例: ```javascript // 打开 IndexedDB 数据库 var request = window.indexedDB.open("myDatabase", 1); // 处理成功和失败事件 request.onerror = function(event) { console.log("Database error: " + event.target.errorCode); }; request.onsuccess = function(event) { console.log("Database opened successfully"); var db = event.target.result; // 添加数据到数据库 var transaction = db.transaction(["customers"], "readwrite"); var objectStore = transaction.objectStore("customers"); var customer = { name: "John", email: "john@example.com" }; var request = objectStore.add(customer); request.onsuccess = function(event) { console.log("Customer added to database"); }; // 从数据库中检索数据 var transaction = db.transaction(["customers"], "readonly"); var objectStore = transaction.objectStore("customers"); var request = objectStore.get(1); request.onerror = function(event) { console.log("Error retrieving customer"); }; request.onsuccess = function(event) { var customer = event.target.result; console.log("Retrieved customer: " + customer.name); }; }; // 创建数据库架构 request.onupgradeneeded = function(event) { var db = event.target.result; var objectStore = db.createObjectStore("customers", { keyPath: "id", autoIncrement: true }); objectStore.createIndex("name", "name", { unique: false }); objectStore.createIndex("email", "email", { unique: true }); }; ``` 这段代码会创建一个名为 "myDatabase" 的 IndexedDB 数据库,其中包含一个名为 "customers" 的对象仓库,用于存储客户数据。该代码还演示了如何向数据库添加数据、从数据库检索数据以及如何创建对象仓库和索引。 ### 回答2: IndexedDB 是一种在 web 浏览器中使用的客户端存储数据库。它可以用于存储大量结构化数据,并且能够在离线状态下进行访问。 一个使用 IndexedDB 的实例可以是一个在线笔记应用。在这个应用中,用户可以创建、编辑和删除笔记。使用 IndexedDB,应用可以将这些笔记存储在本地,以便用户在断网或者关闭浏览器后仍然可以访问。 在这个应用中,首先需要创建一个数据库,用于存储笔记的数据。然后,可以创建一个 object store,用于存储每一条笔记的数据。每一条笔记可以由一个对象表示,其中包含标题、内容和日期等属性。 当用户创建新的笔记时,应用会将该笔记的数据添加到 object store 中。当用户编辑或者删除笔记时,应用会相应地更新或者删除 object store 中对应的数据。 当用户重新打开应用时,可以从 IndexedDB 中获取存储的笔记数据,并在界面上展示出来。用户可以通过界面进行编辑,应用会即时地更新 IndexedDB 中的数据。 除了基本的增删改查操作,IndexedDB 还提供了强大的查询功能。通过使用索引,可以高效地搜索和过滤数据。例如,可以根据标题关键字进行搜索,并返回包含该关键字的所有笔记。 总而言之,IndexedDB 提供了一种方便可靠的方式来在 web 浏览器中存储大量结构化数据。通过使用它,可以实现很多实用的应用,如在线笔记应用等。 ### 回答3: IndexedDB 是 HTML5 标准中的一种客户端数据库,可以在浏览器中存储和操作大量的结构化数据。下面是一个使用 IndexedDB 的示例: 首先,在 JavaScript 中创建一个 IndexedDB 数据库,并指定数据库的名称和版本号: ```javascript let request = indexedDB.open('myDatabase', 1); ``` 然后,在打开数据库成功的回调函数中创建一个对象存储空间(类似于表): ```javascript request.onsuccess = (event) => { let db = event.target.result; let objectStore = db.createObjectStore('myObjectStore', { keyPath: 'id' }); }; ``` 现在,可以向对象存储空间中添加数据项: ```javascript request.onsuccess = (event) => { let db = event.target.result; let transaction = db.transaction('myObjectStore', 'readwrite'); let objectStore = transaction.objectStore('myObjectStore'); let data = { id: 1, name: 'John', age: 25 }; let request = objectStore.add(data); request.onsuccess = (event) => { console.log('Data added successfully'); }; request.onerror = (event) => { console.error('Error adding data'); }; }; ``` 还可以使用索引检索数据: ```javascript request.onsuccess = (event) => { let db = event.target.result; let transaction = db.transaction('myObjectStore', 'readonly'); let objectStore = transaction.objectStore('myObjectStore'); let index = objectStore.index('name'); let request = index.get('John'); request.onsuccess = (event) => { let data = event.target.result; console.log(`Name: ${data.name}, Age: ${data.age}`); }; request.onerror = (event) => { console.error('Error retrieving data'); }; }; ``` 此外,还可以更新和删除数据、创建和删除索引等等。这只是一个简单的使用 IndexedDB 的示例,实际应用中可以根据需求进行更复杂的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值