マイナー・マイナー

隠れた名作の発掘が生きがい。

【JavaScript】Indexed Databaseのアップグレード処理メモ


スポンサードリンク

Indexed Databaseのアップグレードは、DBのオープン時にアップグレードバージョンを指定し、イベントハンドラonupgradeneededで検知してそこで一連のマイグレーション処理を行えば良さそうです。


DBの新規作成処理の例

// Indexed DBの操作をするためのオブジェクト取得
var indexedDB = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB || window.msIndexedDB;

// Indexed DBのオープン
var request = indexedDB.open("sample");

// DBの新規作成
request.onupgradeneeded = function() {
     console.log("onupgradeneeded");

     // オブジェクトストアの作成、初期データの追加等
     idb = request.result;
     var store = idb.createObjectStore("member", {keyPath: "userId"});
     store.put({userId: "00000001", name: "hoge", age: 27});
     store.put({userId: "00000002", name: "piyo", age: 27});
}

// 処理成功時のイベントハンドラ
request.onsuccess = function(event) {
     console.log("onsuccess");
     console.log(request.result.version); // 作成した段階ではversion = 1
}

1回目の実行ではonupgradeneededとonsuccessが順番に呼ばれますが、2回目以降はonsuccessのみ呼ばれます。


DBのアップグレード処理の例

// Indexed DBの操作をするためのオブジェクト取得
var indexedDB = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB || window.msIndexedDB;

// Indexed DBのオープン
var request = indexedDB.open("sample", 2);  // versionを指定

// DBのアップグレード
request.onupgradeneeded = function() {
     console.log("onupgradeneeded");
     // マイグレーション処理
}

// 処理成功時のイベントハンドラ
request.onsuccess = function(event) {
     console.log("onsuccess");
     console.log(request.result.version); // 指定されたバージンに更新されている(version = 2)
}

indexedDB.openにローカルのversionよりも大きいversionを指定すると、onupgradeneededが呼ばれます。この中でDBが新規か更新かを判定してマイグレーション処理を行えば良さそうです。処理成功時はversionが更新されています。


関連記事:
minor.hatenablog.com