IndexedDB 簡單封裝

来源:https://www.cnblogs.com/huangenai/archive/2018/10/10/9766453.html
-Advertisement-
Play Games

IndexedDB 瀏覽器資料庫,是一個非關係型資料庫,數據形式使用的是json,IndexedDB適合存儲大量數據,它的API是非同步調用的,當然他的api 也相對複雜。 當然瀏覽器數據存儲 還有LocalStorage,Cookies,web SQL等 為什麼還再來一個indexedDB。 之前我 ...


IndexedDB 瀏覽器資料庫,是一個非關係型資料庫,數據形式使用的是json,IndexedDB適合存儲大量數據,它的API是非同步調用的,當然他的api 也相對複雜。

當然瀏覽器數據存儲 還有LocalStorage,Cookies,web SQL等 為什麼還再來一個indexedDB。

之前我在開發過程中使用的是web sql,可以直接寫sql查詢數據。

LocalStorage,用key-value鍵值模式存儲數據,而且Localstorage就是專門為小數量數據設計的。

Cookies只能是字元串 而且空間有限。

如果你在實際應用中希望存儲大量數據時,IndexedDB會明顯的更適合,IndexedDB也能提供你更為複雜的查詢數據的方式,還能建立索引,他的索引還是挺666的。

下麵是自己看了阮一峰的 文章 http://www.ruanyifeng.com/blog/2018/07/indexeddb.html

簡單的學習了下 IndexedDB 對這個瀏覽器資料庫有個大概的瞭解,下麵是個人對IndexedDB 簡單的封裝。

 

const dbName = "test";
const dbVersion = 1;

export default {
  // indexedDB相容
  indexedDB:
    window.indexedDB ||
    window.webkitindexedDB ||
    window.msIndexedDB ||
    window.mozIndexedDB,
  //name:表名  key:主鍵 ,cursorIndex 索引
  store: {
    teacher: {
      name: "teacher",
      key: "id",
      cursorIndex: [{ name: "teachNum", unique: false }]
    },
    student: {
      name: "student",
      key: "id",
      cursorIndex: [{ name: "stuNum", unique: false }]
    }
  },
  async initDB() {
    let that = this;
    let request = this.indexedDB.open(dbName, dbVersion);
    request.onerror = function() {
      console.log("打開資料庫失敗");
    };

    request.onsuccess = function() {
      console.log("打開資料庫成功");
    };
    request.onupgradeneeded = function(event) {
      let db = event.target.result;
      for (var t in that.store) {
        if (!db.objectStoreNames.contains(that.store[t].name)) {
          var objectStore = db.createObjectStore(that.store[t].name, {
            keyPath: that.store[t].key,
            autoIncrement: true
          });
          for (let i = 0; i < that.store[t].cursorIndex.length; i++) {
            const element = that.store[t].cursorIndex[i];
            objectStore.createIndex(element.name, element.name, {
              unique: element.unique
            });
          }
        }
      }
    };
  },
  // 打開資料庫
  openDB: function() {
    return new Promise((resolve, reject) => {
      let request = this.indexedDB.open(dbName, dbVersion);

      request.onerror = function(event) {
        reject("IndexedDB資料庫打開錯誤," + event);
      };
      request.onsuccess = function(event) {
        resolve(event.target.result);
      };
    });
  },
  // 刪除表
  deleteDB: function(table) {
    let deleteQuest = this.indexedDB.deleteDatabase(table);
    deleteQuest.onerror = function() {
      return Promise.resolve(false);
    };
    deleteQuest.onsuccess = function() {
      return Promise.resolve(true);
    };
  },
  // 關閉資料庫
  closeDB: async function(db) {
    try {
      let d;
      if (!db) {
        d = await this.openDB();
      }
      let closeQuest = d.closeDB();
      return new Promise(resolve => {
        closeQuest.onerror = function() {
          resolve(false);
        };
        closeQuest.onsuccess = function() {
          resolve(true);
        };
      });
    } catch (error) {
      return Promise.resolve(false);
    }
  },
  // 添加數據,add添加新值
  insert: async function(table, data) {
    try {
      let db = await this.openDB();
      let request = db
        .transaction(table.name, "readwrite")
        .objectStore(table.name)
        .add(data);

      return new Promise((resolve, reject) => {
        request.onerror = function() {
          reject("添加數據出錯");
        };
        request.onsuccess = function() {
          resolve(true);
        };
      });
    } catch (error) {
      console.log(error);
      return Promise.resolve(false);
    }
  },
  // 更新
  update: async function(table, data) {
    try {
      let db = await this.openDB();
      let request = db
        .transaction(table.name, "readwrite")
        .objectStore(table.name)
        .put(data);
      return new Promise(resolve => {
        request.onerror = function() {
          resolve(false);
        };
        request.onsuccess = function() {
          resolve(true);
        };
      });
    } catch (error) {
      return Promise.resolve(false);
    }
  },
  // 刪除數據
  delete: async function(table, keyValue) {
    try {
      let db = await this.openDB();
      let request = db
        .transaction(table.name, "readwrite")
        .objectStore(table.name)
        .delete(keyValue);
      return new Promise(resolve => {
        request.onerror = function() {
          resolve(false);
        };
        request.onsuccess = function() {
          resolve(true);
        };
      });
    } catch (error) {
      return Promise.resolve(false);
    }
  },
  // 清空數據
  clear: async function(table) {
    let db = await this.openDB();
    let store = db.transaction(table.name, "readwrite").objectStore(table.name);
    store.clear();
  },
  // 查詢數據 表名 索引值 索引 key  沒有value key為key 而不是索引
  get: async function(table, keyValue, indexCursor) {
    try {
      let db = await this.openDB();
      let store = db
        .transaction(table.name, "readonly")
        .objectStore(table.name);
      let request;
      request = !keyValue
        ? store.openCursor()
        : indexCursor
          ? store.index(indexCursor).get(keyValue)
          : store.get(keyValue);
      let data = [];
      return new Promise(resolve => {
        request.onerror = function() {
          resolve("查詢數據失敗");
        };
        request.onsuccess = function(event) {
          if (!keyValue && !indexCursor) {
            if (event.target.result) {
              data.push(event.target.result.value);
              event.target.result.continue();
            } else {
              resolve(data);
            }
          } else {
            resolve([event.target.result]);
          }
        };
      });
    } catch (error) {
      return Promise.reject(error);
    }
  },
  //   通過游標操作數據, callback中要有游標移動方式
  handleDataByCursor: async function(table, keyRange) {
    try {
      let kRange = keyRange || "";
      let db = await this.openDB();
      let store = db.transaction(table, "readwrite").objectStore(table),
        request;
      request = store.openCursor(kRange);
      return new Promise(resolve => {
        request.onerror = function() {
          resolve("通過游標獲取數據報錯");
        };
        request.onsuccess = function(event) {
          let cursor = event.target.result;
          resolve(cursor);
        };
      });
    } catch (error) {
      return Promise.reject(error);
    }
  },
  // 通過索引游標操作數據, callback中要有游標移動方式
  handleDataByIndex: async function(table, keyRange, sursorIndex) {
    try {
      let kRange = keyRange || "";
      let db = await this.openDB();
      let store = db.transaction(table, "readwrite").objectStore(table),
        request;
      request = store.index(sursorIndex).openCursor(kRange);
      return new Promise(resolve => {
        request.onerror = function() {
          resolve("通過索引游標獲取數據報錯");
        };
        request.onsuccess = function(event) {
          let cursor = event.target.result;
          if (cursor) {
            resolve(cursor);
          }
        };
      });
    } catch (error) {
      return Promise.reject(error);
    }
  },
  // 創建游標索引
  createCursorIndex: async function(table, cursorIndex, unique) {
    var db = await this.openDB();
    let store = db.transaction(table, "readwrite").objectStore(table);
    store.createIndex(cursorIndex, cursorIndex, {
      unique: unique
    });
    return Promise.resolve();
  }
};

 


此隨筆乃本人學習工作記錄,如有疑問歡迎在下麵評論,轉載請標明出處。

如果對您有幫助請動動滑鼠右下方給我來個贊,您的支持是我最大的動力。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 需要瞭解的知識點: 1. 向指定元素添加事件的方法:addEventListener()方法 2. Dom2級事件中事件流的三個階段:事件捕獲階段、目標元素、事件冒泡階段 3. javascript中 “this與e.target”的區別 addEventListener()方法 語法:addEve ...
  • 1.setTimeout與setInterval的區別 setTimeout: 1.直接使用的話,按照指定 的時間,只執行一次傳入的函數參數。 2.函數的終止使用clearTimeout。 setInterval: 1.直接使用的話,按照指定的時間,迴圈執行傳入的函數參數 2.函數的終止使用clea ...
  • 使用HTML5 canvas的註意事項,非零環繞原則的使用,closePath與lineTo的區別,使用arc產生的問題 ...
  • Sass 快速入門 | SASS 中文網 文檔鏈接:https://www.sasscss.com/getting-started/ 前言 之前整理了一篇關於Less的,現在就來整理一下關於Sass的。 因為這兩種都是CSS的主流預處理器,當然還有Stylus。 要解釋一下什麼是Sass嗎? Sas ...
  • 一、變數作用域 變數作用域指的是變數的作用範圍,javascript中的變數分為全局變數和局部變數 1、全局變數:在函數之外定義的變數,為整個頁面公用,函數的內部外部都可以訪問。 2、局部變數:在函數內部定義的變數,只能在定義該變數的函數內部訪問,外部無法訪問。函數內部訪問變數時,先在內部查找是否有 ...
  • 在前面,我們學習了標準文檔流,但在實際製作的過程中,用標準文檔流書寫顯然是不現實的,因此,我們來瞭解幾種脫離標準文檔流的方法: 1.float 浮動 float:left/right;(左浮/右浮) 效果:元素都加浮動,後面的元素緊跟前面的元素併排排列 第一個加了float,脫離了標準文檔流,對於瀏 ...
  • 安裝 新建一個文件夾 i18n ,內新建 en.js zh.js index.js 三個文件 準備翻譯信息 en.js zh.js index.js 創建Vue-i18n實例 i18n 掛載到 vue 根實例 main.js 簡單的使用 about.vue 註意: 比如說上面的hi 你要通過這種形式 ...
  • 在h5中實現一些小標簽、按鈕的時候,很容易發現部分安卓機型上的字體顯示有問題,總會向上偏移2px左右。這是設置padding或line-height無法修複的,與rem也無關,即使在字體大於12px時依然存在。下圖來自於網友的分享,從左到右依次是顯示正常的蘋果、顯示正常的安卓、顯示異常的安卓: 可能 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...