Newer
Older
robot_dog_patrol_front / src / utils / indexDB.ts
liyaguang on 25 Dec 3 KB 需求与问题修改
class IndexDBCache {
  constructor(dbName: string, version = 1, storeName = 'defaultStore') {
    this.dbName = dbName
    this.version = version
    this.storeName = storeName
    this.db = null
  }

  // 初始化数据库
  async init() {
    return new Promise((resolve, reject) => {
      const request = indexedDB.open(this.dbName, this.version)

      request.onerror = (event) => {
        reject(new Error('Database open error: ' + event.target.errorCode))
      }

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

      request.onupgradeneeded = (event) => {
        const db = event.target.result
        if (!db.objectStoreNames.contains(this.storeName)) {
          db.createObjectStore(this.storeName, { keyPath: 'id', autoIncrement: true });
        }
      }
    })
  }

  // 添加数据
  async add(data) {
    return new Promise((resolve, reject) => {
      const transaction = this.db.transaction([this.storeName], 'readwrite')
      const store = transaction.objectStore(this.storeName)
      const request = store.add(data)

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

      request.onerror = (event) => {
        reject(new Error('Add operation failed: ' + event.target.error.message))
      }
    })
  }

  // 更新数据
  async update(data) {
    return new Promise((resolve, reject) => {
      const transaction = this.db.transaction([this.storeName], 'readwrite')
      const store = transaction.objectStore(this.storeName)
      const request = store.put(data)

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

      request.onerror = (event) => {
        reject(new Error('Update operation failed: ' + event.target.error.message))
      }
    })
  }

  // 删除数据
  async delete(id) {
    return new Promise((resolve, reject) => {
      const transaction = this.db.transaction([this.storeName], 'readwrite')
      const store = transaction.objectStore(this.storeName)
      const request = store.delete(id)

      request.onsuccess = (event) => {
        resolve()
      }

      request.onerror = (event) => {
        reject(new Error('Delete operation failed: ' + event.target.error.message));
      }
    })
  }
  // 删除所有数据
  deleteAll() {
    this.getAll((allData) => {
      allData.forEach(element => {
        this.delete(item.id)
      })
    })
  }

  // 查询数据(根据 id)
  async get(id) {
    return new Promise((resolve, reject) => {
      const transaction = this.db.transaction([this.storeName], 'readonly')
      const store = transaction.objectStore(this.storeName)
      const request = store.get(id)

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

      request.onerror = (event) => {
        reject(new Error('Get operation failed: ' + event.target.error.message))
      }
    })
  }

  // 查询所有数据
  async getAll() {
    return new Promise((resolve, reject) => {
      const results = [] as any[]
      const transaction = this.db.transaction([this.storeName], 'readonly')
      const store = transaction.objectStore(this.storeName)
      const request = store.openCursor()

      request.onsuccess = (event) => {
        const cursor = event.target.result
        if (cursor) {
          results.push(cursor.value)
          cursor.continue()
        } else {
          resolve(results)
        }
      }

      request.onerror = (event) => {
        reject(new Error('Get all operation failed: ' + event.target.error.message))
      }
    })
  }

  // 关闭数据库连接
  close() {
    if (this.db) {
      this.db.close()
      this.db = null
    }
  }

  // 获取初始化状态
  getStatus() {
    return Boolean(this.db)
  }

}
const indexDB = new IndexDBCache('myDatabase')
export default indexDB