indexDB的使用

/**
 * 封装的方法以及用法
 * 打开数据库
 */
import NProgress from "nprogress";
import "nprogress/nprogress.css";

export function openDB(dbName, storeName, version) {
  return new Promise((resolve, reject) => {
    let indexedDB = window.indexedDB;
    var db;
    const request = indexedDB.open(dbName, version);
    request.onsuccess = function(event) {
      db = event.target.result; // 数据库对象
      resolve(db);
    };

    request.onerror = function(event) {
      reject(event);
    };

    request.onupgradeneeded = function(event) {
      // 数据库创建或升级的时候会触发
      console.log("onupgradeneeded");
      db = event.target.result; // 数据库对象
      let objectStore;
      if (!db.objectStoreNames.contains(storeName)) {
        objectStore = db.createObjectStore(storeName, { keyPath: "id" }); // 创建表
        // objectStore.createIndex('name', 'name', { unique: true }) // 创建索引 可以让你搜索任意字段
      }
    };
  });
}

/**
 * 新增数据
 */
export function addData(db, storeName, data, type) {
  return new Promise((resolve, reject) => {
    let request = db
      .transaction([storeName], "readwrite") // 事务对象 指定表格名称和操作模式("只读"或"读写")
      .objectStore(storeName);
    // .add(data); // 仓库对象
    if (type == 1) {
      //只添加一个
      request.add(data);
    } else {
      //添加多个
      for (let i = 0; i < data.length; i++) {
        request.add(data[i]);
      }
    }
    NProgress.done();
    request.onsuccess = function(event) {
      resolve(event);
    };

    request.onerror = function(event) {
      throw new Error(event.target.error);
      reject(event);
    };
  });
}

/**
 * 通过主键读取数据
 */
export function getDataByKey(db, storeName, key) {
  return new Promise((resolve, reject) => {
    let transaction = db.transaction([storeName]); // 事务
    let objectStore = transaction.objectStore(storeName); // 仓库对象
    let request = objectStore.get(key);

    request.onerror = function(event) {
      reject(event);
    };

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

/**
 * 通过游标读取数据
 */
export function cursorGetData(db, storeName) {
  let list = [];
  let store = db
    .transaction(storeName, "readwrite") // 事务
    .objectStore(storeName); // 仓库对象
  let request = store.openCursor(); // 指针对象
  return new Promise((resolve, reject) => {
    request.onsuccess = function(e) {
      let cursor = e.target.result;
      if (cursor) {
        // 必须要检查
        list.push(cursor.value);
        cursor.continue(); // 遍历了存储对象中的所有内容
      } else {
        resolve(list);
      }
    };
    request.onerror = function(e) {
      reject(e);
    };
  });
}

/**
 * 通过索引读取数据
 */
export function getDataByIndex(db, storeName, indexName, indexValue) {
  let store = db.transaction(storeName, "readwrite").objectStore(storeName);
  let request = store.index(indexName).get(indexValue);
  return new Promise((resolve, reject) => {
    request.onerror = function(e) {
      reject(e);
    };
    request.onsuccess = function(e) {
      resolve(e.target.result);
    };
  });
}

/**
 * 通过索引和游标查询记录
 */
export function cursorGetDataByIndex(db, storeName, indexName, indexValue) {
  let list = [];
  let store = db.transaction(storeName, "readwrite").objectStore(storeName); // 仓库对象
  let request = store
    .index(indexName) // 索引对象
    .openCursor(IDBKeyRange.only(indexValue)); // 指针对象
  return new Promise((resolve, reject) => {
    request.onsuccess = function(e) {
      let cursor = e.target.result;
      if (cursor) {
        list.push(cursor.value);
        cursor.continue(); // 遍历了存储对象中的所有内容
      } else {
        resolve(list);
      }
    };
    request.onerror = function(ev) {
      reject(ev);
    };
  });
}

/**
 * 更新数据
 */
export function updateDB(db, storeName, data) {
  let request = db
    .transaction([storeName], "readwrite") // 事务对象
    .objectStore(storeName) // 仓库对象
    .put(data);

  request.onsuccess = function() {
    console.log("数据更新成功");
  };

  request.onerror = function() {
    console.log("数据更新失败");
  };
}

/**
 * 删除数据
 */
export function deleteDB(db, storeName, id) {
  let request = db
    .transaction([storeName], "readwrite")
    .objectStore(storeName)
    .delete(id);

  return new Promise((resolve, reject) => {
    request.onsuccess = function(ev) {
      resolve(ev);
    };

    request.onerror = function(ev) {
      resolve(ev);
    };
  });
}

/**
 * 删除数据库
 */
export function deleteDBAll(dbName) {
  let deleteRequest = window.indexedDB.deleteDatabase(dbName);
  return new Promise((resolve, reject) => {
    deleteRequest.onerror = function(event) {
      console.log("删除失败");
    };
    deleteRequest.onsuccess = function(event) {
      console.log("删除成功");
    };
  });
}

/**
 * 关闭数据库
 */
export function closeDB(db) {
  db.close();
  console.log("数据库已关闭");
}

export default {
  openDB,
  addData,
  getDataByKey,
  cursorGetData,
  getDataByIndex,
  cursorGetDataByIndex,
  updateDB,
  deleteDB,
  deleteDBAll,
  closeDB
};
打开数据库:
const dbName = "modelglft",storeName = "modelglft";
const db = await IndexDB.openDB(dbName, storeName, 1);

获取数据库中某id对应的值:
var datas = IndexDB.getDataByKey(db, storeName, "glft");//最后一个参数为键名

调用新增:
IndexDB.addData(
          db,
          storeName,
          [
            { id: "glft", value: glftBlob },
            { id: "model1", value: model1 },
            { id: "model2", value: model2 }
          ],
          0
        );

调用更新数据(data值应该是键值对,不能像增加时一样使用数组)
IndexDB.updateDB(
          db,
          storeName,
          { id: "glft", value: glftBlob },
          { id: "model1", value: model1 },
          { id: "model2", value: model2 },
        );
posted @ 2022-06-29 14:48  JocelynFung  阅读(320)  评论(0编辑  收藏  举报
Live2D 看板娘 / Demo