indexedDB基本使用(内含案例)

indexedDB

indexDB是HTML5的新概念,用于将数据存储再用户的浏览器中,它是一个非关系型数据库,会将数据集作为个体对象存储,数据形式使用的是JSON

indexeddb比本地存储更强大,可用于需要存储大量数据的应用程序。这些应用程序可以更高效地运行,并且加载速度更快。

对象仓库objectStore

一个数据库中可以包含多个objectStore,objectStore可以存放多种类型数据,就相当于是一张表,可以使用每条记录中的某个指定字段作为键值(keypath),也可以使用自动生成的递增数字作为键值(keyGenerator),选择键的类型不同,objectStore可以存储的数据结构也有差异

基本语法
语法作用
window.indexedDB.open(数据库名,版本号)打开数据库(如果数据库不存在则创建一个新的库)
.onerror数据库操作过程中出错时触发
.onupgradeneeded创建一个新的数据库或者修改数据库版本号时触发
.onsuccess数据库成功完成所有操作时触发
.createObjectStore(对象仓库名称,keypath)创建对象仓库
.createIndex(索引名称,keypath,objectParameters)建立索引
.transaction(对象仓库名称) || .transaction(对象仓库名称,‘readwrite’)创建一个事务 || 创建一个事务,并要求具有读写权限
.objectStore(对象仓库名称)获取对象仓库
.get ( num ) || .getAll()获取数据 || 获取全部数据
.add( data )添加数据
.put( newdata )修改数据
.delete ( keypath )删除数据

任务清单案例

<template>
  <div>
    <table cellspacing="0" cellpadding="8" border="1">
      <caption>
        今日任务清单
        <button @click="dialogFormVisible = true">+ 添加任务</button>
      </caption>
      <thead>
        <tr>
          <th>任务内容</th>
          <th>状态</th>
          <th>操作</th>
        </tr>
      </thead>
      <tbody v-if="List.length !== 0">
        <tr v-for="item in List" :key="item.id">
          <td>{{ item.Task }}</td>
          <td style="text-align: center">
            {{ item.status == false ? "未完成" : "已完成" }}
          </td>
          <td style="text-align: center">
            <el-button size="small" @click="removeTask(item.id)"
              >删除</el-button
            >
            <el-button size="small" @click="updateTaskId(item.id)"
              >编辑</el-button
            >
          </td>
        </tr>
      </tbody>
      <tbody class="elseTbody" v-else>
        <tr>
          <td colspan="2">今日你还没有想要做的事哦!</td>
        </tr>
      </tbody>
    </table>
    <el-dialog title="添加任务" :visible.sync="dialogFormVisible" width="90%">
      <el-form :model="addList">
        <el-form-item label="内容" label-width="40px">
          <el-input v-model="addList.Task" autocomplete="off"></el-input>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="dialogFormVisible = false">取 消</el-button>
        <el-button type="primary" @click="addTask">确 定</el-button>
      </div>
    </el-dialog>
    <el-dialog
      title="编辑任务"
      :visible.sync="updateDialogFormVisible"
      width="90%"
    >
      <el-form :model="addList">
        <el-form-item label="内容" label-width="40px">
          <el-input v-model="addList.Task" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="状态" label-width="40px">
          <el-switch v-model="addList.status"></el-switch>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="updateDialogFormVisible = false">取 消</el-button>
        <el-button type="primary" @click="updateTask">确 定</el-button>
      </div>
    </el-dialog>
  </div>
</template>
<script>
export default {
  data () {
    return {
      db: null,
      // 全部任务清单
      List: [],
      // 添加任务清单
      addList: {
        id: new Date().getTime(),
        Task: '',
        status: false
      },
      // 添加任务清单对话框显示
      dialogFormVisible: false,
      // 修改任务清单对话框显示
      updateDialogFormVisible: false
    }
  },
  created () {
    this.indexedDB()
    // this.readList()
  },
  methods: {
    // 初始化indexedDB
    indexedDB () {
      // 打开数据库,两个参数(数据库名字,版本号),如果数据库不存在则创建一个新的库
      var request = window.indexedDB.open('TaskList', '1')
      // 数据库操作过程中出错,则错误回调被触发
      request.onerror = (event) => {
        console.log(event)
      }
      this.request = request
      // 创建一个新的数据库或者修改数据库版本号时触发
      request.onupgradeneeded = (event) => {
        var db = event.target.result
        // 创建对象仓库用来存储数据,把id作为keyPath,keyPath必须保证不重复,相当于数据库的主键
        var objectStore = db.createObjectStore('Today_Mission', { keyPath: 'id' })
        // 建立索引,name和age可能重复,因此unique设置为false
        objectStore.createIndex('Task', 'Task', { unique: false })
        objectStore.createIndex('status', 'status', { unique: false })
      }
      // 数据库操作一切正常,所有操作后触发
      this.request.onsuccess = (event) => {
        this.db = event.target.result
        this.readList()
      }
    },
    readList () {
      var transaction = this.db.transaction('Today_Mission').objectStore('Today_Mission')
      var request = transaction.getAll()

      request.onerror = (event) => {
        this.$message.error('事务失败')
      }

      request.onsuccess = (event) => {
        this.List = request.result
      }
    },
    addTask () {
      if (this.addList.Task !== '') {
        var request = this.db.transaction('Today_Mission', 'readwrite')
          .objectStore('Today_Mission')
          .add(this.addList)
        request.onsuccess = (event) => {
          this.$message.success('添加成功')
          this.dialogFormVisible = false
          this.readList()
          this.addList = {
            id: new Date().getTime(),
            Task: '',
            status: false
          }
        }
        request.onerror = (event) => {
          this.$message.error('添加失败')
        }
      } else {
        this.$message.error('内容不能为空哦')
      }
    },
    updateTaskId (id) {
      this.updateDialogFormVisible = true
      this.addList = this.List.find(item => item.id === id)
    },
    updateTask () {
      if (this.addList.Task !== '') {
        var request = this.db.transaction('Today_Mission', 'readwrite')
          .objectStore('Today_Mission')
          .put(this.addList)

        request.onsuccess = (event) => {
          this.$message.success('数据更新成功')
          this.updateDialogFormVisible = false
          this.readList()
          this.addList = {
            id: new Date().getTime(),
            Task: '',
            status: false
          }
        }

        request.onerror = (event) => {
          this.$message.error('数据更新失败')
        }
      } else {
        this.$message.error('内容不能为空哦')
      }
    },
    removeTask (id) {
      this.$confirm('确定要删除这条任务嘛', '删除任务', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'error'
      }).then(() => {
        var request = this.db.transaction('Today_Mission', 'readwrite')
          .objectStore('Today_Mission')
          .delete(id)

        request.onsuccess = (event) => {
          this.$message.success('删除成功')
          this.readList()
        }
      }).catch(() => {
        this.$message({
          type: 'info',
          message: '已取消删除'
        })
      })
    }
  }
}
</script>
<style>
table {
  width: 100%;
  border: 1px solid #ccc;
}
caption {
  padding: 20px 0px;
  font-size: 20px;
  font-weight: bold;
}
caption button {
  display: block;
  width: 100%;
  font-size: 13px;
  text-align: left;
  margin-top: 20px;
  height: 35px;
  border: 1px solid rgb(248, 206, 206);
  color: rgb(83, 81, 81);
  padding-left: 15px;
  background-color: rgb(255, 234, 223);
}
thead tr {
  height: 50px;
}
thead tr th {
  border-bottom: 1px solid #ccc;
}
tbody tr {
  font-size: 13px;
}
.elseTbody tr {
  height: 70px;
  font-size: 13px;
  letter-spacing: 2px;
  text-align: center;
}
</style>

  • 6
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
IndexedDB 是浏览器提供的本地数据库,可以在浏览器中存储结构化数据。下面是 IndexedDB基本使用方法: 1. 打开数据库 使用 `indexedDB` 对象的 `open()` 方法打开数据库,如下所示: ``` let request = indexedDB.open('myDB', 1); ``` 其中,第一个参数是数据库名称,第二个参数是数据库版本号。如果数据库不存在,则会创建一个新的数据库。 2. 创建对象仓库 在成功打开数据库的回调方法 `request.onsuccess` 中,可以获取到数据库对象 `event.target.result`,然后使用它的 `createObjectStore()` 方法创建一个对象仓库(即数据表),如下所示: ``` let db = event.target.result; let objectStore = db.createObjectStore('people', { keyPath: 'id' }); ``` 其中,第一个参数是对象仓库的名称,第二个参数是一个对象,包含一个 keyPath 属性和其他可选属性。keyPath 用来指定数据表中的主键。 3. 添加数据 使用事务 `db.transaction()` 开启一个事务,然后使用 `add()` 方法向数据表中添加数据,如下所示: ``` let transaction = db.transaction(['people'], 'readwrite'); let objectStore = transaction.objectStore('people'); let request = objectStore.add({ id: 1, name: 'John Doe' }); ``` 其中,第一个参数是一个数组,包含要访问的对象仓库的名称,第二个参数是事务类型,可以是 'readonly' 或 'readwrite'。`add()` 方法的参数是要添加的数据。 4. 查询数据 使用事务 `db.transaction()` 开启一个事务,然后使用 `get()` 方法查询数据,如下所示: ``` let transaction = db.transaction(['people']); let objectStore = transaction.objectStore('people'); let request = objectStore.get(1); request.onsuccess = function(event) { console.log('Name: ' + event.target.result.name); }; ``` `get()` 方法的参数是要查询的数据的主键值。查询结果保存在 `request.onsuccess` 回调方法中的 `event.target.result` 中。 5. 更新数据 使用事务 `db.transaction()` 开启一个事务,然后使用 `put()` 方法更新数据,如下所示: ``` let transaction = db.transaction(['people'], 'readwrite'); let objectStore = transaction.objectStore('people'); let request = objectStore.put({ id: 1, name: 'Jane Doe' }); ``` `put()` 方法的参数是要更新的数据。 6. 删除数据 使用事务 `db.transaction()` 开启一个事务,然后使用 `delete()` 方法删除数据,如下所示: ``` let transaction = db.transaction(['people'], 'readwrite'); let objectStore = transaction.objectStore('people'); let request = objectStore.delete(1); ``` `delete()` 方法的参数是要删除的数据的主键值。 以上就是 IndexedDB基本使用方法。需要注意的是,IndexedDB 的 API 非常庞大,不仅仅包含上面提到的这些方法,还包括索引、游标、版本升级等功能。如果需要更详细的介绍和示例代码,可以参考 MDN 的文档:https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值