IndexedDB 是一個事務型數據庫系統,相似於基於 SQL 的 RDBMS。 然而不一樣的是它使用固定列表,IndexedDB 是一個基於 JavaScript 的面向對象的數據庫。現有的瀏覽器數據儲存方案,都不適合儲存大量數據:Cookie 的大小不超過 4KB,且每次請求都會發送回服務器 LocalStorage 在 2.5MB 到 10MB 之間(各家瀏覽器不一樣),並且不提供搜索功能,不能創建自定義的索引。因此,須要一種新的解決方案,這就是 IndexedDB 誕生的背景javascript
簡單來講,IndexedDB 就是瀏覽器提供的本地數據庫。html
IndexedDB 具備如下特色java
對比關係數據庫 MySql 能夠獲得如下關係web
// 全局變量兼容性問題 window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB; window.IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || window.msIDBTransaction; window.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange || window.msIDBKeyRange; if (!window.indexedDB) { window.alert( "Your browser doesn't support a stable version of IndexedDB. Such and such feature will not be available." ); }
var databaseName = "MyTestDatabase"; var databaseVersion = 1; // 打開數據庫 var request = window.indexedDB.open(databaseName, databaseVersion); request.onsuccess = function(event) { console.log("open success"); }; request.onerror = function(event) { console.log("open fail"); }; request.onupgradeneeded = function(event) {};
window.indexedDB.open
函數打開對應的數據庫,若是沒有該數據庫就會新建。數據庫
新建數據庫
或者數據庫版本
大於當前版本會觸發onupgradeneeded
事件瀏覽器
數據庫爲何會有版本?由於數據庫的數據解構可能會發生改變的
,因此通常修改數據解構的操做在onupgradeneeded
裏面書寫服務器
window.indexedDB.deleteDatabase(databaseName);
建立和修改表格是修改數據庫的數據解構
,因此我把他們寫在onupgradeneeded
事件裏異步
request.onupgradeneeded = function(event) { console.log("onupgradeneeded"); db = event.target.result; // 建立倉庫對象(建立表格) // 這裏我將主鍵設置爲id var objectStore = db.createObjectStore(objectStoreName, { keyPath: "id", autoIncrement: true }); };
request.onupgradeneeded = function(event) { console.log("onupgradeneeded"); db = event.target.result; // 刪除倉庫對象(刪除表格) db.deleteObjectStore(objectStoreName); };
var databaseName = "MyTestDatabase"; var databaseVersion = 1; var db; var objectStoreName = "objectStore1"; var storeDatas = [ { id: "1", name: "張三", age: 18 }, { id: "2", name: "李四", age: 19 } ]; var request = window.indexedDB.open(databaseName, databaseVersion); request.onsuccess = function(event) { console.log("open success"); db = event.target.result; // 將數據保存到新建的對象倉庫 var objectStore = db .transaction([objectStoreName], "readwrite") .objectStore(objectStoreName); storeDatas.forEach(function(dataItem) { // 添加一條數據 objectStore.add(dataItem); }); };
var databaseName = "MyTestDatabase"; var databaseVersion = 1; var db; var objectStoreName = "objectStore1"; var storeDatas = [ { id: "1", name: "張三", age: 18 }, { id: "2", name: "李四", age: 19 } ]; var request = window.indexedDB.open(databaseName, databaseVersion); request.onsuccess = function(event) { console.log("open success"); db = event.target.result; console.log("刪除數據"); var req = db .transaction([objectStoreName], "readwrite") .objectStore(objectStoreName) .delete("2"); // 這裏的「2」指定的是主鍵的鍵值 req.onsuccess = function() { console.log("刪除成功"); }; req.onerror = function() { console.log("刪除失敗"); }; };
console.log("更新數據"); var req = db .transaction([objectStoreName], "readwrite") .objectStore(objectStoreName) .put({ id: "2", name: "王五", age: 17 }); // 將整條數據給替換 req.onsuccess = function() { console.log("更新成功"); }; req.onerror = function() { console.log("更新失敗"); };
console.log("讀取數據"); var req = db .transaction([objectStoreName], "readonly") .objectStore(objectStoreName) .get("1"); // 這裏的「1」也是主鍵的鍵值 req.onsuccess = function() { console.log("獲取成功"); console.log(req.result); }; req.onerror = function() { console.log("獲取失敗"); };
console.log("遍歷數據"); var objectStore = db .transaction([objectStoreName], "readonly") .objectStore(objectStoreName); var count = 0; objectStore.openCursor().onsuccess = function(event) { var cursor = event.target.result; if (cursor) { console.log(`第${++count}條數據爲`); console.log(cursor.value); cursor.continue(); // 將指針移動下一個位置 } else { console.log("沒有更多數據"); } };
indexedDB的API仍是很是多的,這裏只是簡單介紹了最經常使用的幾個操做(我的認爲^_^)。函數