indexedDB使用

效果图

在这里插入图片描述

浏览器数据

在这里插入图片描述

初始化

// 使用 IndexedDB 的第一步是打开数据库,使用indexedDB.open()方法。
let db;
const request = indexedDB.open("myDB", 2);

// 打开数据库失败
request.onerror = (event) => {
  console.log("连接失败", event);
};

// 成功打开数据库
request.onsuccess = (event) => {
  db = request.result;
  console.log("数据库打开成功");
};

// 如果指定的版本号,大于数据库的实际版本号,就会发生数据库升级事件
request.onupgradeneeded = (event) => {
  db = event.target.result;
  // 建表
  let objectStore;
  if (!db.objectStoreNames.contains("users")) {
    objectStore = db.createObjectStore("users", {
      keyPath: "id",
      autoIncrement: true,
    });
    // 新建索引,三个参数分别为索引名称、索引所在的属性、配置对象
    objectStore.createIndex("name", "name", { unique: false });
  }
};

const getUserTX  = () => {
    return db.transaction(["users"], "readwrite").objectStore("users")
}

const getDB = () => db

export {
    getUserTX,
    getDB
}

API

import { getUserTX , getDB } from "./init";
// 去除proxy
const removeProxy = (data) => JSON.parse(JSON.stringify(data));

// 新增
const add = (data) =>
  new Promise((resolve, reject) => {
    const request = getUserTX()
      .add(removeProxy(data));

    request.onsuccess = (event) => resolve(event);
    request.onerror = (event) => reject(event);
  });

//   获取单个
const read = (id) =>
  new Promise((resolve, reject) => {
    const request = getUserTX()
      .get(id);

    request.onsuccess = (event) => resolve(event);
    request.onerror = (event) => reject(event);
  });

//   获取所有
const readAll = () =>
  new Promise((resolve, reject) => {
    const objectStore = getUserTX()
    const rst = [];
    objectStore.openCursor().onsuccess = (event) => {
      const cursor = event.target.result;
      if (cursor) {
        rst.push({
          id: cursor.key,
          name: cursor.value.name,
          age: cursor.value.age,
          sex: cursor.value.sex,
        });
        cursor.continue();
      } else {
        resolve(rst);
      }
    };
  });

//   更新
const update = (data) =>
  new Promise((resolve, reject) => {
    const request = getUserTX()
      .put(data);

    request.onsuccess = (event) => resolve(event);
    request.onerror = (event) => reject(event);
  });

//   删除
const remove = (id) =>
  new Promise((resolve, reject) => {
    const request = getUserTX()
      .delete(id);

    request.onsuccess = (event) => resolve(event);
    request.onerror = (event) => reject(event);
  });

// 通过建立的name索引来查询
const searchByName = (name) =>
  new Promise((resolve, reject) => {
    const request = getUserTX()
      .index("name")
      .get(name);

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

export { add, read, readAll, update, remove, getDB , searchByName};

页面使用

<template>
    <div class="content">
        <div class="end">
            <el-input v-model="searchName" placeholder="请输入需要查询的姓名" />
            <div>
                <el-button @click="addUser" type="success" circle :icon="Plus" />
                <el-button @click="getList" type="primary" circle :icon="Search" />
            </div>
        </div>
        <el-table :data="tableData" :border="baseConfig.isBorder">
            <el-table-column v-if="baseConfig.isSelected" type="selection" width="55" />
            <el-table-column :="col" v-for="(col,index) in tableCol" :key="index" />
            <el-table-column v-if="baseConfig.isEvent" label="操作" :align="baseConfig.eventAligin">
                <template #default="{row}">
                    <el-button type="primary" :icon="Edit" circle @click="updateRow(row)" />
                    <el-button type="danger" :icon="Delete" circle @click="deleteRow(row)" />
                </template>
            </el-table-column>
        </el-table>
        <el-dialog v-model="showForm" width="500px" :title="isEdit?'编辑':'新增'">
            <el-form :model="userForm" ref="formRef" label-width="120px">
                <el-form-item label="姓名" prop="name">
                    <el-input v-model="userForm.name"></el-input>
                </el-form-item>
                <el-form-item label="年龄" prop="age">
                    <el-input v-model="userForm.age"></el-input>
                </el-form-item>
                <el-form-item label="性别" prop="sex">
                    <el-select v-model="userForm.sex">
                        <el-option value="男"></el-option>
                        <el-option value="女"></el-option>
                    </el-select>
                </el-form-item>
                <el-form-item>
                    <el-button @click="submitForm" type="primary" class="ml30" :icon="Promotion" circle></el-button>
                    <el-button @click="reset" class="ml30" :icon="Refresh" circle></el-button>
                </el-form-item>
            </el-form>
        </el-dialog>
    </div>
</template>
    
<script setup>
// 插件
import { Plus, Edit, Delete, Search, Promotion, Refresh } from '@element-plus/icons-vue'
import { ref, reactive } from 'vue'
import { ElMessage } from "element-plus";
// 自己的方法
import { add, read, readAll, update, remove , searchByName} from './goDB'
// import { add, read, readAll, update, remove, getDB , searchByName} from './indexedDB'

// ====================table基础配置开始==========================>
const baseConfig = {
    isBorder: true,
    isSelected: true,
    isEvent: true,
    eventAligin: 'center'
}
// table列
const tableCol = [
    { label: 'ID', prop: 'id', width: 60, align: 'center' },
    { label: '姓名', prop: 'name', width: 'auto', align: 'center' },
    { label: '年龄', prop: 'age', width: 'auto', align: 'center' },
    { label: '性别', prop: 'sex', width: 'auto', align: 'center' }
]
const tableData = ref([])
// <====================table基础配置结束==========================

// ======================form基础配置开始==========================>
const userForm = reactive({
    age: '',
    name: '',
    sex: '男'
})

const formRef = ref(null)
const showForm = ref(false)
const isEdit = ref(false)
const editId = ref(null)
// <======================form基础配置结束==========================

// 获取列表信息
const searchName = ref('')
const getList = () => {
    if(searchName.value){
        searchByName(searchName.value).then(res=>{
            tableData.value = [res]
        })
    }else{
        readAll().then(res => {
            tableData.value = res
        })
    }

}

// 由于indexedDB是异步的,可能此时并没有加载完成。所以使用事件当其加载完成的时候去执行getList()
// const timer = setInterval(() => {
//     if (getDB()) {
//         getList()
//         clearInterval(timer)
//     }
// }, 1000)
// godb的方式可以直接getList()
getList()

// 删除
const deleteRow = row => {
    remove(row.id).then(res => {
        ElMessage.success("删除成功");
        getList()
    })
}

// 新增
const addUser = () => {
    isEdit.value = false
    showForm.value = true
    userForm.age = ''
    userForm.name = ''
    userForm.sex = ''
}

// 编辑
const updateRow = row => {
    isEdit.value = true
    showForm.value = true
    userForm.age = row.age
    userForm.name = row.name
    userForm.sex = row.sex
    editId.value = row.id
}

const submitForm = () => {
    if (isEdit.value) {
        update({ ...userForm, id: editId.value }).then(res => {
            ElMessage.success("编辑成功");
            getList()
        }).catch(err => {
            ElMessage.error("编辑失败");
            console.log(err);
        }).finally(() => {
            showForm.value = false
        })
    } else {
        add(userForm).then(res => {
            getList()
            ElMessage.success("新增成功");
        }).catch(err => {
            console.log(err);
            ElMessage.error("新增失败");
        }).finally(() => {
            showForm.value = false
        })
    }

}

// 重置表单
const reset = () => formRef.value.resetFields()
</script>

<style scoped>
.content{
    padding:0 20px;
}
.end {
    display: flex;
    justify-content: space-between;
    padding: 20px 0;
}

.end .el-input{
    width: 300px;
}

.el-select {
    width: 100%;
}

.ml30 {
    margin-left: 30px;
}
</style>

使用godb的方式

import GoDB from "godb";

// 连接数据库
const myDB = new GoDB("myDB");
// 建表
const user = myDB.table("users");

// 去除proxy
const removeProxy = (data) => JSON.parse(JSON.stringify(data));
// 新增
const add = (data) => user.add(removeProxy(data));

//   获取单个
const read = (id) => user.get(id);

//   获取所有
const readAll = () => user.getAll();

//   更新
const update = (data) => user.put(data);

//   删除
const remove = (id) => user.delete(id);

// 一次性添加多条数据
const addMany = (data) => user.addMany(data);

const getInfo = () => user.consoleTable()

// 查找数据
const searchByName = (name) => user.find(item=> item.name === name)

export { add, read, readAll, update, remove , searchByName, addMany , getInfo};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答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: "[email protected]" }; 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 的示例,实际应用中可以根据需求进行更复杂的操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值