indexeddb全方位詳解

indexed是indexeddb的縮寫,是一款用來在瀏覽器端實現本地資料庫操作的JavaScript API。它採用了對象倉庫(Object Store)存儲數據,通過key-value的方式進行數據的增刪改查操作,並且與Web Worker結合可以高效的處理大量數據操作。

一、indexeddb介紹

1、indexeddb的概念

IndexedDB是HTML5新提供的瀏覽器端存儲數據的一種方案,推出的初衷是為了支持在Web端應用中離線存儲方案的開發。IndexedDB支持在客戶端本地離線存儲數據,提供下一級緩存,並不依賴於網路連接。

2、indexeddb的特點

IndexedDB擅長處理大量的客戶端數據,定義了一個對象倉庫,其中包含了可以使用鍵值對存儲的對象。IndexedDB也支持存儲其他類型的數據,如BLOB和ArrayBuffer。

3、indexeddb的優勢

相對於localStorage和sessionStorage,IndexedDB比較優勢比較明顯:

  • 支持存儲非字元串類型數據:localStorage和sessionStorage只支持存儲字元串類型數據,而IndexedDB可以存儲各種類型的數據,通過Blob對象可以存儲二進位數據,通過ArrayBuffer對象可以存儲大文件。
  • 支持創建多個對象倉庫:每個對象庫相當於一張表,我們可以使用不同的數據結構來存儲不同類型的數據。
  • 支持非同步操作:IndexedDB以非同步的方式讀取和存儲數據,可以在讀取和寫入大段數據時提高性能。
  • 支持事務處理:IndexedDB支持通過事務處理選項來確保數據的完整性,以及避免在並發操作時對數據產生衝突。

因此,IndexedDB適用於那些需要大量讀寫本地數據資源的Web應用,比如:郵件客戶端、CRM系統、日記、聊天等。

二、indexeddb入門

1、創建indexeddb資料庫

    let db;
    let request = window.indexedDB.open("myDatabase", 1);

    request.onerror = function(event) {
        console.log("資料庫打開報錯");
    };
    request.onsuccess = function(event) {
        db = request.result;
        console.log("資料庫打開成功");
    };
    request.onupgradeneeded = function(event) {
        db = event.target.result
        var objectStore = db.createObjectStore("customers", { keyPath: "id" });
        objectStore.createIndex("name", "name", { unique: false });
        objectStore.createIndex("email", "email", { unique: true });
    };
    

打開和創建資料庫的過程是非同步執行的。開發者需要在open方法的onsuccess函數處理非同步回調函數時獲取db對象。

2、向indexeddb資料庫中存儲數據

    let tx = db.transaction(["customers"], "readwrite");
    let objectStore = tx.objectStore("customers");
    let request = objectStore.add({ id: 1, name: "John", email: "john@doe.com" });
    request.onerror = function(event) {
        console.log("添加數據失敗");
    };
    request.onsuccess = function(event) {
        console.log("添加數據成功");
    };
    tx.oncomplete = function() {
        console.log("事務完成");
    };
    

在indexeddb中添加和修改數據的邏輯都是一樣的。首先需要開啟一個事務,然後新建或者獲取已經創建好的object store,最後再向object store中添加數據。

三、indexed註解

1、indexeddb的概念

indexed屬性的特殊含義是將指定的欄位進行索引,建立索引後可以通過索引快速進行數據查找,通過索引的方式可以提高數據查詢的效率。

    let tx = db.transaction(["customers"], "readonly");
    let objectStore = tx.objectStore("customers");
    let index = objectStore.index("name");
    let request = index.get("John");
    request.onerror = function(event) {
        console.log("獲取數據失敗");
    };
    request.onsuccess = function(event) {
        console.log("獲取John的信息:" + request.result.email);
    };
    

在indexeddb中通過index(索引)對象可以進行類似sql中where關鍵字的匹配操作。

2、indexeddb可以刪掉嗎

可以使用indexedDB.deleteDatabase()方法刪除indexedDB資料庫,一旦被刪除就無法恢復。

    let req = indexedDB.deleteDatabase('mycoolnewdatabase');
    req.onsuccess = function () { console.log("Delete successfully");};
    req.onerror = function () { console.log("Delete unsuccessful");};
    

四、indexedDB使用

1、使用事務

需要使用IndexedDB執行數據讀寫操作時,建議將操作寫成一個事務,以保證數據的完整性和一致性。通常一個事務中會包含多個操作,事務的目的是確保相關操作的原子性,也就是說:事務中的一系列操作要麼全部成功,要麼全部失敗。

    let tx = db.transaction(["customers"], "readwrite");
    let objectStore = tx.objectStore("customers");
    objectStore.put({ id: 1, name: "John", email: "john@doe.com" });
    objectStore.put({ id: 2, name: "Bob", email: "bob@doe.com" });
    objectStore.put({ id: 3, name: "Tom", email: "tom@doe.com" });
    tx.oncomplete = function(event) {
        console.log("事務完成");
    };
    

2、使用游標

使用游標可以通過一組條件搜索已存儲的記錄,並按照指定的順序返回這些記錄。cursor方法將返回包含已索引資料庫對象中一個表格中所有先前添加的對象;當你使用它時,你需要通過檢查每個對象檢查檢索的數據是否與您的期望匹配,只有當它們匹配時才執行您的代碼。

    let tx = db.transaction(["customers"], "readonly");
    let store = tx.objectStore("customers");
    let index = store.index('name');
    index.openCursor().onsuccess = function(event) {
        let cursor = event.target.result;
        if (cursor) {
            console.log(cursor.value.name);
            cursor.continue();
        }
    };
    

五、indexed by

1、indexed by的概念

indexed by是基於indexeddb進行一些restapi的封裝,實現簡單易用、高效便捷的本地存儲方案。

2、indexed by的使用

    const client = new IndexedBy({
        dbName: 'database_name',
        objectStores: [{
            name: 'object_store_name',
            keyPath: 'id'
        }]
    });

    client.init().then(() => {
        client.actions.Insert('object_store_name', {
            id: 1,
            name: '可樂',
            number: 10
        });
    });
    

使用indexedby可以大大簡化indexeddb的API使用難度。

六、indexed模式

1、indexed模式的概念

indexed模式是讓indexeddb在有必要時自動升級資料庫模型,讓存儲的數據更有條理。例如,當現有的「顧客」存儲庫缺少郵政編碼一列時,indexedDB將自動更新資料庫。

    let db;
    let request = indexedDB.open("myDatabase", 2);
    request.onupgradeneeded = function(event) {
      let db = event.target.result;
      let objectStore = db.createObjectStore("customers", { keyPath: "id" });
      objectStore.createIndex("name", "name", { unique: false });
      objectStore.createIndex("email", "email", { unique: true });
      objectStore.createIndex("zipcode", "zipcode", { unique: false });
    };
    request.onsuccess = function(event) {
      db = event.target.result;
    };
    

七、indexed by什麼意思

indexed by什麼意思

indexedby是一種全新的IndexedDB庫,為IndexedDB提供了更面向對象的訪問方式。它通過簡單的鏈式調用和類似mongoose的模式來增強IndexedDB。

由此可見,”indexed by”就是把IndexedDB封裝成了一個庫,面向對象化和鏈式調用是它的特色。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/249267.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 13:32
下一篇 2024-12-12 13:32

相關推薦

  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁碟中。在執行sync之前,所有的文件系統更新將不會立即寫入磁碟,而是先緩存在內存…

    編程 2025-04-25
  • 神經網路代碼詳解

    神經網路作為一種人工智慧技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網路的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網路模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web伺服器。nginx是一個高性能的反向代理web伺服器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25
  • 詳解eclipse設置

    一、安裝與基礎設置 1、下載eclipse並進行安裝。 2、打開eclipse,選擇對應的工作空間路徑。 File -> Switch Workspace -> [選擇…

    編程 2025-04-25
  • C語言貪吃蛇詳解

    一、數據結構和演算法 C語言貪吃蛇主要運用了以下數據結構和演算法: 1. 鏈表 typedef struct body { int x; int y; struct body *nex…

    編程 2025-04-25
  • MPU6050工作原理詳解

    一、什麼是MPU6050 MPU6050是一種六軸慣性感測器,能夠同時測量加速度和角速度。它由三個感測器組成:一個三軸加速度計和一個三軸陀螺儀。這個組合提供了非常精細的姿態解算,其…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分散式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25
  • Java BigDecimal 精度詳解

    一、基礎概念 Java BigDecimal 是一個用於高精度計算的類。普通的 double 或 float 類型只能精確表示有限的數字,而對於需要高精度計算的場景,BigDeci…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25

發表回復

登錄後才能評論