概述
IndexedDB 是一個低階 API,用於儲存大量結構化資料(包括檔案/ blob)的客戶端。此 API 使用索引來啟用對此資料的高效能搜尋。雖然 Web 儲存對於儲存較少量的資料很有用,但對於儲存大量結構化資料卻沒那麼有用。建立 IndexedDB 標準是為了在瀏覽器中實現 Javascript 物件的可伸縮,高效能儲存和檢索。
基本
indexedDB 旨在儲存 Javascript 物件文字,例如 {prop1 : value, prop2 : value}
。此外,更近期的實現支援儲存大型二進位制物件(BLOB),例如影象,音訊檔案和視訊檔案。此外,indexedDB 可以儲存包含其他物件(巢狀物件)的物件,例如 {prop1 : value, prop2 : {nestedprop1 : value, nestedprop2 : value}}
。
以下是一些基本概念:
- 資料庫 :物件儲存和索引的容器。每個資料庫都有一個名稱和一個版本。
- 物件儲存 : 物件的容器。這類似於關聯式資料庫中的表。在 indexedDB 中,記錄對應於 Javascript 物件,列對應於 Javascript 物件屬性。新增到商店的物件按新增的順序儲存。針對商店的查詢以相同的順序檢索物件。你可以在物件庫中插入,更新或刪除物件。
- 索引 :物件庫中包含的特定物件的特殊容器。索引也類似於表,可以理解為具有特殊約束的物件儲存。當物件被插入到物件儲存中時,如果它滿足某些條件,它也可以插入到相應的索引儲存中。索引中的物件按索引定義的順序儲存。針對索引的查詢按索引定義的順序檢索物件(儘管可以將查詢配置為以不同方式工作)。你無法在索引中插入,更新或刪除物件(只能通過將物件插入到索引所基於的儲存中來間接執行此操作)。
- 遊標 :遊標類似於查詢。遊標迭代物件儲存或索引中的物件。遊標可以向前或向後移動,搜尋(跳轉或超前物件),並跳轉到底層儲存/索引中的下一個或前一個唯一物件。
- 金鑰路徑 :金鑰路徑類似於關聯式資料庫中表的主鍵(或複合主鍵)。在一般情況下,當你指示 indexedDB 在特定資料庫中建立物件儲存時,還要定義儲存的金鑰路徑。你可以使用金鑰路徑快速獲取特定物件,這類似於使用主鍵在關係表中選擇記錄。你可以選擇使用鍵來確保稍後嘗試將物件插入到已包含具有相同鍵的物件的物件儲存中將產生錯誤。
- 事務和請求 :請求類似於單個 SQL 查詢。存在用於插入物件,刪除物件,更新物件以及迭代一個或多個物件的特定 API 方法。每個方法呼叫對應一個請求。每個請求都發生在事務的上下文中。換句話說,多個請求可以在一個事務中發生。個別請求可能由於各種原因而失敗。在單個事務中執行多個請求時,在所有請求都被視為成功之前,請求不會完全提交。以這種方式,如果在稍後的請求中發生問題,則可以回滾整個事務,使得底層物件儲存的狀態與事務中第一個請求發生之前的狀態相同。
非同步 vs 同步
indexedDB 的 Javascript API 使用非同步技術。當直接與 API 互動而不是某些更高階別的第三方庫時,API 需要使用 Javascript 回撥。非同步設計有助於防止較大的資料處理操作阻塞主 Javascript 執行緒,這有助於防止使用者介面(你在瀏覽器中看到的內容)出現凍結/生澀/滯後。
支援
訪問 http://caniuse.com/#feat=indexeddb 。
學到更多
-
html5rocks.com 上的示例 。 ( 警告: 此示例已過時,例如它使用
setVersion
而不是onupgradeneeded
,因此它可能無法在現代瀏覽器中執行。)