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

主キーからレコードを検索

前述のIDBObjectStoreオブジェクトのget()メソッドを使って、主キーからレコードを検索することができる。
次のサンプルでは主キーの値が99のレコードを検索する。

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

    // DB接続
    var dbname = input_el.value;
    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.onsuccess = function(event){
      // IDBDatabaseオブジェクトを取得
      var db = event.target.result;
      // IDBTransactionオブジェクトを取得
      var transaction = db.transaction(["mystore"],"readonly");
      // IDBObjectStoreオブジェクトを取得
      var store = transaction.objectStore("mystore");
      // 主キーからレコードを検索開始(IDBRequestオブジェクト)
      var getreq = store.get(99);
      getreq.onsuccess = function(event){
        // 検索されたレコード
        var rec = event.target.result;
        if(rec){
          $('<p>ID:' + rec.id + ', name:' + rec.name + ', price:' + rec.price + '</p>').appendTo(result);
        }else{
          $('<p>レコードが見つかりませんでした。</p>').appendTo(result);
        }
        db.close();
      }
    }
  });
});
</script>
</HEAD>
<BODY>
<p>主キーからレコードを検索</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>

①get()メソッドの検索処理は非同期である。このメソッドから得られたIDBRequestオブジェクト(変数getreq)のonsuccessプロパティにコールバック関数をセットする。
②このコールバック関数では引数から受け取ったイベントオブジェクトのtarget.resultプロパティから、検索されたレコードのオブジェクトを取得する。
③今回は、get()メソッドの引数に指定した主キーの値は99である。保存されている主キーは自動採番を使っているため、文字列の”99″ではない。