用來儲存資料到用戶端的瀏覽器。IndexedDB適合用來儲存大量非結構式的資料。
javascript
中的object
IndexedDB
存取資料的方式,是透過Key
來讀取Value
。IndexedDB
上進行的操作都是以Transaction
(交易)的方式執行,假如存取過程中,有一個動作失敗,則整筆交易會取消,不會只存入一半的資料,防止資料不完全。再支援上還不錯,大部分的瀏覽器都已經支援使用
今天就用這個套件,來為專案加入IndexedDB
的功能。
在index.html
首頁中,引入idb.js
檔案。
<script src="./src/js/idb.js"></script>
但在DOM
載入idb.js
的檔案,'在service worker
中是無法使用的(它無法直接操作DOM
),但可以透過import
的方式。
importScripts('/src/js/idb.js');
importScripts()
可以匯入相同網域的程式碼與函式庫。
idb.open(name, version, upgradeCallback)
name
: DB名稱version
: DB版本upgradeCallback
: 假如版本比現在的新會呼叫callback
var dbPromise = idb.open('articles', 1, function(db){
if(!db.objectStoreNames.contains('article'))
db.createObjectStore('article', {keyPath: 'id'});
})
剛剛import idb.js
後,接著建立一個articles
的資料庫,假如資料表中沒有article
的物件,就建立該物件,並以id
當唯一的key
值。
接著要去哪存入資料呢?
還記得前面我們使用Firebase
來抓取文章嗎?
因此,我們要去改fetch
事件,假如請求是firebase
上的文章網址,我們就將文章存入IndexedDB
中。
fetch
事件,存文章到IndexedDBself.addEventListener('fetch', function(event){
var url = 'https://days-pwas-practice.firebaseio.com/article.json';
if(-1 < event.request.url.indexOf(url)){
event.respondWith(
fetch(event.request)
.then(function(response){
var copyRes = response.clone();
copyRes.json()
.then(function(data){
for(var key in data){
dbPromise
.then(function(db){
var transaction = db.transaction('article', 'readwrite');
var article = transaction.objectStore('article');
article.put(data[key]);
return transaction.complete;
})
}
})
})
);
} else{
...
}
});
當Url
是文章時,將請求clone
(資源只能使用一次)後轉成json
格式方存讀取,接著直接看到dbPromise
是上面命名articles
資料庫。
接著使用foreach
將每筆資料丟入dbPromise
(任意命名),transaction
建立交易,並指定要丟入的資料表(ObjectStore
),並設定可以讀寫。put
將資料存入,並回傳complete
完成交易。
到Application
中,選擇Clear Storage
,並點Clear Site
,清除網站的紀錄。
按F5,並看Application
,左邊側邊攔的IndexedDB
可以看到有articles
資料庫,底下有article
資料表,但是沒有任何資料。
那是因為還沒觸發fetch
再一次F5重整網頁
看向右邊攔,發現我們成功將文章內容存入IndexedDB
囉~