控制檯
- 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事件的處理程序的結果(做爲事件參數得到)