IndexedDB 是一個事務型數據庫系統,相似於基於 SQL 的 RDBMS。 然而不一樣的是它使用固定列表,IndexedDB 是一個基於 JavaScript 的面向對象的數據庫。javascript
現有的瀏覽器數據儲存方案,都不適合儲存大量數據:Cookie 的大小不超過 4KB,且每次請求都會發送回服務器 LocalStorage 在 2.5MB 到 10MB 之間(各家瀏覽器不一樣),並且不提供搜索功能,不能創建自定義的索引。因此,須要一種新的解決方案,這就是 IndexedDB 誕生的背景html
簡單來講,IndexedDB 就是瀏覽器提供的本地數據庫。java
IndexedDB 具備如下特色web
對比關係數據庫 MySql 能夠獲得如下關係數據庫
// 全局變量兼容性問題
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仍是很是多的,這裏只是簡單介紹了最經常使用的幾個操做(我的認爲^_^)。ui