摘要:概述是一個事務型數(shù)據(jù)庫系統(tǒng),類似于基于的。然而不同的是它使用固定列表,是一個基于的面向?qū)ο蟮臄?shù)據(jù)庫。參考文檔瀏覽器數(shù)據(jù)庫入門教程
概述
IndexedDB 是一個事務型數(shù)據(jù)庫系統(tǒng),類似于基于 SQL 的 RDBMS。 然而不同的是它使用固定列表,IndexedDB 是一個基于 JavaScript 的面向?qū)ο蟮臄?shù)據(jù)庫。現(xiàn)有的瀏覽器數(shù)據(jù)儲存方案,都不適合儲存大量數(shù)據(jù):Cookie 的大小不超過 4KB,且每次請求都會發(fā)送回服務器 LocalStorage 在 2.5MB 到 10MB 之間(各家瀏覽器不同),而且不提供搜索功能,不能建立自定義的索引。所以,需要一種新的解決方案,這就是 IndexedDB 誕生的背景
簡單來說,IndexedDB 就是瀏覽器提供的本地數(shù)據(jù)庫。
IndexedDB 具有以下特點
鍵值對儲存
異步操作(避免鎖死瀏覽器)
支持事務
同源限制(協(xié)議+域名+端口)
存儲空間大
支持二進制存儲(ArrayBuffer 對象和 Blob 對象,可存儲文件數(shù)據(jù))
基本概念對比關系數(shù)據(jù)庫 MySql 可以得到以下關系
數(shù)據(jù)庫:IDBDatabase
表格:對象倉庫(IDBObjectStore)
行數(shù)據(jù):對象倉庫存儲的一條數(shù)據(jù)
索引:IDBindex,加速數(shù)據(jù)的檢索(在對象倉庫里面可為不同的鍵創(chuàng)建)
事務:IDBTransaction
操作請求:IDBRequest
IDBCursor:遍歷對象存儲空間和索引
IDBKeyRange:定義鍵的范圍數(shù)據(jù)
基本操作 兼容性注意點// 全局變量兼容性問題 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." ); }數(shù)據(jù)庫操作 打開/新建數(shù)據(jù)庫
var databaseName = "MyTestDatabase"; var databaseVersion = 1; // 打開數(shù)據(jù)庫 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函數(shù)打開對應的數(shù)據(jù)庫,如果沒有該數(shù)據(jù)庫就會新建。
新建數(shù)據(jù)庫或者數(shù)據(jù)庫版本大于當前版本會觸發(fā)onupgradeneeded事件
數(shù)據(jù)庫為什么會有版本?
因為數(shù)據(jù)庫的數(shù)據(jù)解構可能會發(fā)生改變的,所以一般修改數(shù)據(jù)解構的操作在onupgradeneeded里面書寫
window.indexedDB.deleteDatabase(databaseName);對象倉庫操作(表格操作)
創(chuàng)建和修改表格是修改數(shù)據(jù)庫的數(shù)據(jù)解構,所以我把他們寫在onupgradeneeded事件里
創(chuàng)建表格request.onupgradeneeded = function(event) { console.log("onupgradeneeded"); db = event.target.result; // 創(chuàng)建倉庫對象(創(chuàng)建表格) // 這里我將主鍵設置為id var objectStore = db.createObjectStore(objectStoreName, { keyPath: "id", autoIncrement: true }); };刪除表格
request.onupgradeneeded = function(event) { console.log("onupgradeneeded"); db = event.target.result; // 刪除倉庫對象(刪除表格) db.deleteObjectStore(objectStoreName); };數(shù)據(jù)操作(行數(shù)據(jù)操作) 新增數(shù)據(jù)(增)
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; // 將數(shù)據(jù)保存到新建的對象倉庫 var objectStore = db .transaction([objectStoreName], "readwrite") .objectStore(objectStoreName); storeDatas.forEach(function(dataItem) { // 添加一條數(shù)據(jù) objectStore.add(dataItem); }); };刪除數(shù)據(jù)(刪)
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("刪除數(shù)據(jù)"); var req = db .transaction([objectStoreName], "readwrite") .objectStore(objectStoreName) .delete("2"); // 這里的“2”指定的是主鍵的鍵值 req.onsuccess = function() { console.log("刪除成功"); }; req.onerror = function() { console.log("刪除失敗"); }; };修改數(shù)據(jù)(改)
console.log("更新數(shù)據(jù)"); var req = db .transaction([objectStoreName], "readwrite") .objectStore(objectStoreName) .put({ id: "2", name: "王五", age: 17 }); // 將整條數(shù)據(jù)給替換 req.onsuccess = function() { console.log("更新成功"); }; req.onerror = function() { console.log("更新失敗"); };獲取數(shù)據(jù)(查)
console.log("讀取數(shù)據(jù)"); 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("獲取失敗"); };通過指針對象遍歷表格數(shù)據(jù)
console.log("遍歷數(shù)據(jù)"); 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}條數(shù)據(jù)為`); console.log(cursor.value); cursor.continue(); // 將指針移動下一個位置 } else { console.log("沒有更多數(shù)據(jù)"); } };小結
indexedDB的API還是非常多的,這里只是簡單介紹了最常用的幾個操作(個人認為^_^)。
參考文檔IndexedDB_API
瀏覽器數(shù)據(jù)庫 IndexedDB 入門教程
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/101633.html
摘要:前端最基礎的就是。這是初級階段的最后一堂了。敏感數(shù)據(jù)要設置防止意外的被他人獲取。是什么服務器端存放數(shù)據(jù)。都是用來做瀏覽器端存儲的。解決的問題的存儲大小問題。該使用索引來實現(xiàn)對該數(shù)據(jù)的高性能搜索。 前端最基礎的就是 HTML+CSS+Javascript。掌握了這三門技術就算入門,但也僅僅是入門,現(xiàn)在前端開發(fā)的定義已經(jīng)遠遠不止這些。前端小課堂(HTML/CSS/JS),本著提升技術水平,...
摘要:設置為參數(shù)設置指定索引,并確保唯一性上面主要做了件事打開數(shù)據(jù)庫表新建,并設置設置打開數(shù)據(jù)庫表主要就是版本號和名字,沒有太多講的,我們直接從創(chuàng)建開始吧。打開注意事項檢查是否支持版本更新在生成一個實例時,需要手動指定一個版本號。 在知乎和我在平常工作中,常常會看到一個問題: 前端現(xiàn)在還火嗎? 這個我只想說: 隔岸觀火的人永遠無法明白起火的原因,只有置身風暴,才能找到風眼之所在 ——『秦時明...
摘要:在不指定的情況下,默認版本號為。具體示例如下在需要更新數(shù)據(jù)庫的模式時,需要更新版本號。此時我們指定一個高于之前版本的版本號,就會觸發(fā)事件。數(shù)據(jù)操作事務在中,我們也能夠使用事務來進行數(shù)據(jù)庫的操作。 概述 本文通過對IndexedDB的使用方法和使用場景進行相關介紹,對常見的問題進行解答。 同時,因為MDN中的相關文檔缺乏相關邏輯性,所以不容易理解。本文將通過項目中常見的數(shù)據(jù)存儲和操作需求...
摘要:優(yōu)異的性能表現(xiàn),有一部分原因要歸功于瀏覽器存儲技術的提升。是服務端生成,客戶端進行維護和存儲。當超過時,它將面臨被裁切的命運。此外很多瀏覽器對一個站點的個數(shù)也是有限制的。存入讀取數(shù)據(jù)保存的數(shù)據(jù),以鍵值對的形式存在。 前言 隨著移動網(wǎng)絡的發(fā)展與演化,我們手機上現(xiàn)在除了有原生 App,還能跑WebApp——它即開即用,用完即走。一個優(yōu)秀的 WebApp 甚至可以擁有和原生 App 媲美的功...
閱讀 2305·2021-09-30 09:47
閱讀 2223·2021-09-26 09:55
閱讀 2954·2021-09-24 10:27
閱讀 1543·2019-08-27 10:54
閱讀 971·2019-08-26 13:40
閱讀 2499·2019-08-26 13:24
閱讀 2423·2019-08-26 13:22
閱讀 1735·2019-08-23 18:38