IndexedDBの使い方

  • 6
    いいね
  • 0
    コメント

IndexedDBを使うと、ブラウザ内にWebStorageより大量のデータを保存できる。
ブラウザのプライベートウィンドウではまだ使えない場合がある。
IE11では、ローカルにファイルを置いてfile://urlにアクセスしても使えない。webサーバー上に置けば使える。
IndexedDBを扱う処理は非同期。
データベースへの接続やデータの挿入、取得などのリクエストが、成功したときにはonsuccess、失敗した時にはonerrorが呼び出されるので、その場合に応じた処理を呼び出される関数の中に書く。

データベース新規作成・接続

var dbName = 'sampleDB';

var openReq  = indexedDB.open(dbName);
// DB名を指定して接続。DBがなければ新規作成される。

  openReq.onupgradeneeded = function(event){
  //onupgradeneededは、DBのバージョン更新(DBの新規作成も含む)時のみ実行
    console.log('db upgrade');
  }
  openReq.onsuccess = function(event){
  //onupgradeneededの後に実行。更新がない場合はこれだけ実行
    console.log('db open success');
    var db = event.target.result;
    // 接続を解除する
    db.close();
  }
  openReq.onerror = function(event){
  // 接続に失敗
    console.log('db open error');
  }

db.close()しないままでも、indexedDB.open(dbName)はできる。
しかし、DBの更新や削除は、closeしてからでないとできない(onupgradeneeded, onsuccess, onerrorのどれも実行されない)。

データベース削除

var deleteReq = indexedDB.deleteDatabase(dbName);

  deleteReq.onsuccess = function(event){
    console.log('db delete success');
    // 存在しないDB名を指定してもこっちが実行される
  }

  deleteReq.onerror = function(){
    console.log('db delete error');
  }

オブジェクトストア作成

オブジェクトストアは、RDBでいうテーブル。

var storeName  = 'sampleStore';

var openReq = indexedDB.open(dbName, dbVersion);
// オブジェクトストアの作成・削除はDBの更新時しかできないので、バージョンを指定して更新

  openReq.onupgradeneeded = function(event){
    var db = event.target.result;
    db.createObjectStore('storeName', {keyPath : 'id'})
  }

オブジェクトストアの作成、削除はDBの更新時に実行されるonupgradeneededの中でしかできない。
DBの新規作成時以外でDBを更新するには、open()のときにDBの新しいバージョンを指定する。
現在のバージョンは、以下のように取得できる。

var dbVersion;
openReq.onsuccess = function(event){
  var db = event.target.result;
  dbVersion = db.version;
}

データ挿入

var data = {id : 'A1', name : 'test'};

var openReq = indexedDB.open(dbName);

openReq.onsuccess = function(event){
    var db = event.target.result;
    var trans = db.transaction(storeName, 'readwrite');
    var store = trans.objectStore(storeName);
    var putReq = store.put(data);

    putReq.onsuccess = function(){
      console.log('put data success');
    }

    trans.oncomplete = function(){
    // トランザクション完了時(putReq.onsuccessの後)に実行
      console.log('transaction complete');
    }

 }

putの他にaddもある。putはデータの挿入または更新で、addは挿入だけ。keyの値が重複したデータをaddしようとするとエラーになるが、putでは上書きする。

データ取得

var keyValue = 'A1';

var openReq = indexedDB.open(dbName);

  openReq.onsuccess = function(event){
    var db = event.target.result;
    var trans = db.transaction(storeName, 'readonly');
    var store = trans.objectStore(storeName);
    var getReq = store.get(keyValue);

    getReq.onsuccess = function(event){
      console.log(event.target.result); // {id : 'A1', name : 'test'}
    }
  }