構造化データ非同期ストレージ(Indexed Database API)

オブジェクトストアの生成

オブジェクトストアの生成と削除は、IDBDatabaseオブジェクトのcreateObjectStore()とdeleteObjectStore()メソッドを使う。これらのメソッドは、データベースが新たに生成されたとき、または、データベースのバージョンが上がったときに呼び出されるIDBOpenDBRequestオブジェクトのonupgradeneededプロパティに指定したコールバック関数の中だけで使うことができる。

次のレコード構造をオブジェクトストアに挿入する。
{ id:1 , name:”商品1” , price:500  }

<script type="text/javascript">
$(function(){
  // IDBFactoryオブジェクトを取得
  var idb = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB;
  if( !idb ) { 
     alert('indexedDBをサポートしていない');
     return;
  }
  $('#exec').click(function(){
    var result = $('#result');
    // データベース名を得る
    var input_el = document.querySelector("#name");
    var valid = input_el.checkValidity();
    if(valid === false){
      alert(input_el.validationMessage);
      return;
    }

    var dbname = input_el.value;
    var deletereq = idb.deleteDatabase(dbname);
    // DB削除に失敗したときの処理
    deletereq.onerror = function(){
      $('<p>DB削除に失敗しました。</p>').appendTo(result);
    }
    // DB接続
    var openreq = idb.open(dbname,1);
    // DB接続に失敗したときの処理
    openreq.onerror = function(event){
      var error = event.taget.error;
      $('<p>DB接続に失敗しました ' + error.name + ' ' + error.message + '</p>').appendTo(result);
    }

    // DB生成に成功したときの処理
    openreq.onupgradeneeded = function(event){
      // IDBDatabaseオブジェクトを取得
      var db = event.target.result;
      // オブジェクトストア生成(IDBObjectStoreオブジェクト)
      var params = { keyPath: "id",autoIncrement:true };
      var store = db.createObjectStore("mystore",params);
      // インデックス生成
      var index_params = { unique:false };
      store.createIndex("name_index","name",index_params);
      $('<p>オブジェクトストアの生成に成功しました。</p>').appendTo(result);
      db.close();
    }
  });
});
</script>
</HEAD>
<BODY>
<p>Indexd Databaseの作成</p>
<form action="#" method="post" id="register">
 <label for="name">データベース名:</label>
 <input type="text" name="name" id="name" required>
 <input id="exec" type="button" value="実行">
</form>
<div id="result"></div>
</BODY>

①オブジェクトストアの生成に使う、createObjrctStore()メソッドに指定する第二引数には、keyPathに主キーの名前を、autoIncrementには真偽値を指定する。autoIncrementにtrueを指定すれば、keyPathに指定した主キーに自動採番が適用される。なお、autoIncrementは、keyPathで主キーを指定した場合のみ有効になる。
②インデックスの生成には、createIndex()メソッドを使う。第一引数にはインデックスの名前を、第二引数にはインデックスの対照となるカラムの名前を、第三引数にはパラメータをを指定する。
③パラメータのuniqueにtrueをセットすると、同じカラムに同じ値を挿入することができないインデックスを作る。
④オブジェクトストアの生成は、RDBMSとは違い、事前に全カラムを定義する必要はない。主キーが要らなければ、createObjectStoreの第二引数を指定しなくてもよい。