indexDB-基础使用-vue篇

话不多说直接上代码,
里面是封装好的,可以直接复制,进行测试

<template>
  <div class="home">
    <div @click="add">新增</div>
    <div @click="read">获取</div>
    <div @click="readAll">获取全部</div>
    <div @click="deleteData">删除</div>
    <div @click="deleteDb('dbname')">删除数据库</div>
    <div @click="putData">更新</div>
  </div>
</template>

<script>

export default {
  name: 'HomeView',
  data(){
    return{
      indexedDB: window.indexedDB || window.webkitindexedDB || window.msIndexedDB || window.mozIndexedDB,//兼容
    }
  },
  created(){
    this.dbInit
  },
  methods:{
      dbInit () {
      return new Promise((resolve, reject) => {
        //打开数据库,如果没有就新建一个
         //dbname库的名称,2为版本号,切记,版本号不能为小数,会自动四舍五入
        const connection = this.indexedDB.open('dbname', 2)
        connection.onblocked = function(event) {
          // 如果其他的一些页签加载了该数据库,在我们继续之前需要关闭它们
          alert("请关闭其他由该站点打开的页签!");
        };
        connection.addEventListener('success', (event) => {
          const db = event.target.result;
          db.addEventListener('versionchange', (event) => {
            console.log('The version of this database has changed');
          });

        });
        //成功回调
        connection.onsuccess = function (event) {
          resolve(event.target.result)
        }
        //
        connection.onupgradeneeded = function (event) {
          const db = event.target.result
          if (!db.objectStoreNames.contains('person')) {
            //为该数据库创建一个对象仓库,person,主键为id,下面使用调用的时候主要对应主键
            //autoIncrement 标记会为该仓库开启键生成器。默认该设置是不开启的
            //使用键生成器,当你向对象仓库新增记录时键会自动生成。对象仓库生成的键往往从 1 开始,然后自动生成的新的键会在之前的键的基础上加 1。生成的键的值从来不会减小,除非数据库操作结果被回滚
            db.createObjectStore('person', 
            { keyPath: 'id' },
            // { autoIncrement: true }
            )
          }
        }
         //失败回调
        connection.onerror = function (err) {
          reject(err)
        }
      })
    },
    //type 方法类型  data第几条
    async dbOperation (type, data) {
      let typeList = ['add', 'get', 'getAll' , 'delete',"put"]//方法名字
      //如果传的值不在这个列表中
      if (!typeList.includes(type)) {
        throw new Error(`操作类型错误, 仅支持: ${typeList.toString()} 方法`)
      }
      //事务模式有两个选项 readonly 或 readwrite ,默认为 readonly 模式,只读和写入数据
      const readType = type === 'add'||'delete'||'put' ? 'readwrite' : 'readonly'
      const res = await this.dbInit()
      const objectStore = res.transaction('person', readType).objectStore('person')
    
      const response = new Promise((resolve, reject) => {
        const request = objectStore[type](data)
        request.onsuccess = (res) => {
          resolve(res.target.result)
        }
        request.onerror = (err) => {
          reject(err)
        }
        request.oncomplete = (event)=> {
          alert("All done!");
        }
        
      })
      return response
    },
    async add () {
      const data = {
        id:new Date().getTime(),
        name: 'name',
        age: 'age',
        email: 'email@11.11'
      }
      const res = await this.dbOperation('add', data)
      console.log(res)
    },
    async read () {
      const res = await this.dbOperation('get', 1663222119985)
      console.log(res)
    },
    async readAll () {
      const res = await this.dbOperation('getAll')
      console.log(res)
    },
    async deleteData () {
      await this.dbOperation('delete',1663222119985)
    },
    async putData () {
      const res = await this.dbOperation('get', 1663222119985)
      console.log(res)
      res.age = "11111"
      const ress = await this.dbOperation('put',res)
      console.log(ress)
    },
    async deleteDb(dbname) {
      var delReq = indexedDB.deleteDatabase(dbname)

      delReq.onerror = function(event) {
        console.log('删除数据库时出错.')
      }

      delReq.onblocked = function(event) {
        console.log('阻止删除数据库.')
      }
      
      delReq.onsuccess = function(event) {
        console.log('数据库删除成功')
        db.onversionchange = function() {
      +   db.close()
          console.log('数据库已过时,请重新加载页面.')
        } 
        console.log(event.result) // undefined
      }
    },
  }
}
</script>