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事件的處理程序的結果(做爲事件參數得到)
相關文章
相關標籤/搜索