控制台
- 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事件的處理程序的結果(作為事件參數獲得)