IndexedDB基本概念


控制台

  • IndexedDB下為數據庫
  • 數據庫下為表,表內容展現為主鍵值和其余值,其中其余值包括索引和其他任意字段,以對象形式表現
  • 表下為索引字段表,用來展現擁有同一種索引字段的所有數據(有多少種索引就會有多少張對應的表)
  • 控制台顯示會有不同步現象,當可能有出入時會有黃色感嘆號提醒,可以通過刷新當前數據庫獲得最新狀態

——————————————————————————————————————————————————————————

IndexedDB概況

  • indexedDB也遵從同源協議
  • API包含異步(asynchronous) API 和同步(synchronous)API兩種。 異步API適合大多數情況, 同步API必須同 WebWorkers一同使用. 目前,沒有主流瀏覽器支持同步API。
  • IndexedDB 是key-value型數據庫(簡單好使)

基本概念

  • IndexedDB 數據庫使用 key-value 鍵值對儲存數據。key可以是二進制對象。
  • IndexedDB API提供了索引(indexes)、表(tables)、指針(cursors)等等
  • 事務(transaction)有生存周期,在生存周期以后使用它會報錯。並且,事務(transaction)是自動提交的,不可以手動提交。
  • 事務是為了避免異步操作可能產生的讀寫沖突
  • IndexedDB在結果准備好之后通過DOM事件通知用戶 DOM事件總是有一個類型(type)屬性(在IndexedDB中,該屬性通常設置為success或error)。DOM事件還有一個目標(target)屬性,用來告訴事件是被誰觸發的。通常情況下,目標(target)屬性是數據庫操作生成的IDBRequest。成功(success)事件不彈出提示並且不能撤銷,錯誤(error)事件會彈出提示且可以撤銷。這一點是非常重要的,因為除非錯誤事件被撤銷,否則他們會終止所在的任何事務。
  • IndexedDB是面向對象的。(可以根據儲存的對象類型在同一張表中建立不同的索引進行區分)

名詞解釋

數據庫

  • 當操作系統被告知去寫入數據后 IDBTransaction.oncomplete 事件被觸發(如果操作系統崩潰或在數據被寫入磁盤前斷電,那么整個事務都將丟失)
  • 對象倉庫中的的數據以 keys 升序排列。(根據主鍵排序?)
  • 對象存儲可以有一個 key generator 和一個 key path。如果對象倉庫有 key path,則使用 in-line keys; 否則使用 out-of-line keys
    • 鍵生成器(key generator)自動遞增添加主鍵
    • 鍵路徑(key path)一個合法的鍵路徑可以是以下形式:一個空字符串,一個 JavasScript 標識符,或由句點分割的多個 JavaScript 標識符。但不能包括空格。(主鍵)
    • 內鍵(in-line key)作為存儲值一部分的鍵。(主鍵和其他值都被一起保存在value中)
    • 外鍵(out-of-line key)與值分開存儲的鍵。
  • 一個比當前版本號更高的值去打開數據庫。這會開啟一個 VERSION_CHANGE 事務並且觸發 upgradeneeded 事件。只有在該事件的處理函數中才能更新數據庫模式。
  • 一個給定的數據庫可以同時擁有多個連接。
  • 任何對於數據庫中的數據讀和修改的操作只能在事務中進行
  • 一個數據庫連接可以擁有多個與之關聯的事務,只要進行寫操作事務的作用域不相互重合。事務的作用域在事務被創建時就被確定,指定事務能夠進行交互的對象倉庫(object store),作用域一旦被確定就會在整個生命周期中保持不變。對於讀操作的事務,你可以同時擁有多個,即使他們有重疊的作用域。
  • 事務被期望擁有較短的生命周期,所以瀏覽器會終止一個消耗時間過長的事務,為了釋放存儲資源,運行過久的事務會被鎖定。你可以中斷一個事務,來回滾事務中對數據庫進行的操作。並且你甚至不需要等待事務開始或激活就可以中斷它。(對同一條數據記錄所有影響到該數據事務,回滾時執行能夠產生反效果的SQL?)
  • 事務有三種模式:讀寫、只讀和版本變更。創建和刪除對象倉庫(object store)的唯一方法就是通過調用版本變更事務。
  • 因為所有的事情都在事務中發生
  • 索引(index)(一個新的表以索引字段為主鍵,以被索引表中的主鍵為值)

鍵和值

  • 鍵可以是以下數據類型:字符串、日期、浮點和數組。對於數組,鍵的取值可以從空數組到無窮。並且你可以使用嵌套數組。
  • 值可以包含任何 JavaScript 表達式,包括:布爾、數字、字符串、日期、對象、數組、正則、未定義和 null。
  • 主鍵(key)是默認建立索引的屬性。比如,數據記錄是{ id: 1, name: '張三' },那么id屬性可以作為主鍵。主鍵也可以指定為下一層對象的屬性,比如{ foo: { bar: 'baz' } }的foo.bar也可以指定為主鍵。

范圍和作用域

  • 游標(cursor)在鍵的某個范圍內迭代查詢多條記錄的機制。游標有一個指向正在被迭代的對象倉庫或索引的源。它處於該范圍內的一個位置,並按照鍵的順序正向或逆向的移動。

局限性

  • 全文搜索。IndexedDB 接口沒有類似 SQL 語句中 LIKE 的功能。

————————————————————————————————————————————————————————

IndexedDB

  • IndexedDB 在 Web Worker 中可用

接口

  • 在window對象的indexedDB屬性上調用open()方法。該方法返回一個 IDBRequest對象
  • 異步操作通過在 IDBRequest對象上觸發事件來和調用程序進行通信
  • IDBRequest 處理數據庫請求並提供對結果訪問的通用接口。(所有異步操作的繼承類?)
  • IDBFactory 提供數據庫訪問。這是全局對象indexedDB實現的接口,因此是API的入口。(indexedDB的父類?)

連接數據庫

  • IDBOpenDBRequest 表示一個打開數據庫的請求。
var DBOpenRequest = window.indexedDB.open("toDoList", 4);

DBOpenRequest.onerror = function(event) {
  
};

DBOpenRequest.onsuccess = function(event) {
  
};

DBOpenRequest.onupgradeneeded = function(event) { // 升級、新建版本

}
  • IDBDatabase 表示一個數據庫連接。這是在數據庫中獲取交易的唯一方式。(用來修改表結構(添加刪除表,修改索引等)或者獲取事務)
var DBOpenRequest = window.indexedDB.open("toDoList", 4);

DBOpenRequest.onsuccess = function(event) {

    db = DBOpenRequest.result; // IDBDatabase 應該是指這個

  };

接收和修改數據

  • IDBTransaction 表示一個交易。在數據庫上創建一個交易,指定作用域(例如要訪問的存儲對象),並確定所需的訪問類型(只讀或讀寫)。事務對象提供error、abort和complete三個事件,用來監聽操作結果。
    • 寫入數據需要新建一個事務。新建時必須指定表格名稱和操作模式("只讀"或"讀寫")
// 應該是指一個交易(事務)
var trans1 = db.transaction("foo", "readwrite");
  • IDBObjectStore 表示允許訪問通過主鍵查找的IndexedDB數據庫中的一組數據的對象存儲區。(通過事務獲得,代表對象倉庫)
var objectStore1 = trans1.objectStore("foo")

objectStore1.put("1", "key");
  • IDBCursor 迭代對象存儲和索引。(指針對象)
function readAll() {
  var objectStore = db.transaction('person').objectStore('person');

   objectStore.openCursor().onsuccess = function (event) {
     var cursor = event.target.result;

     if (cursor) {
       console.log('Id: ' + cursor.key);
       console.log('Name: ' + cursor.value.name);
       console.log('Age: ' + cursor.value.age);
       console.log('Email: ' + cursor.value.email);
       cursor.continue();
    } else {
      console.log('沒有更多數據了!');
    }
  };
}

readAll();
  • IDBIndex 也是為了允許訪問IndexedDB數據庫中的數據子集,但使用索引來檢索記錄而不是主鍵。這有時比使用IDBObjectStore更快。
var transaction = db.transaction(['person'], 'readonly');
var store = transaction.objectStore('person');
var index = store.index('name');
var request = index.get('李四');

request.onsuccess = function (e) {
  var result = e.target.result;
  if (result) {
    // ...
  } else {
    // ...
  }
}
  • IDBCursorWithValue 迭代對象存儲和索引並返回游標的當前值。
// 缺少

  • IDBKeyRange 定義可用於從特定范圍內的數據庫檢索數據的鍵范圍。(主鍵集合)
  var keyRangeValue = IDBKeyRange.bound("A", "F"); // IDBKeyRange用於創建檢索范圍

  var transaction = db.transaction(['fThings'], 'readonly');
  var objectStore = transaction.objectStore('fThings');

  objectStore.openCursor(keyRangeValue).onsuccess = function(event) {...}

自定義事件接口

  • IDBVersionChangeEvent 作為IDBOpenDBRequest.onupgradeneeded事件的處理程序的結果(作為事件參數獲得)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM