全レコードの読み出し
オブジェクトストアに登録されたレコードをすべて読み取る場合はカーソルを使う。カーソルとは、データの読み出し位置を指すポインタである。このポインタを1つずつレコード単位で動かすことによって個々のレコード情報を読み出すことができる。
<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 cursorreq = store.openCursor(); // カーソル準備が成功したときの処理 cursorreq.onsuccess = function(event){ // IDBCursorオブジェクトを取得 var cursor = event.target.result; // IDBCursorオブジェクトが存在すればレコードを表示して次へ if(cursor){ // 検索されたレコードのオブジェクト var rec = cursor.value; $('<p>ID:' + rec.id + ', name:' + rec.name + ', price:' + rec.price + '</p>').appendTo(result); // カーソルを次のレコードに移動 cursor.continue(); }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>
①カーソルを準備するには、IDBObjectStoreオブジェクト(変数store)のopenCursor()メソッドを使う。このメソッドを呼び出すと、非同期に先頭レコードにカーソルを移動する。このメソッドは、IDBRequestオブジェクト(変数cursorreq)を返す。
②カーソルの移動が完了すると、IDBRequestオブジェクト(変数cursorreq)のonsuccessプロパティにセットされたコールバック関数が呼び出される。このコールバック関数の引数に引き渡されるイベントオブジェクト(変数event)のtarget.resultプロパティから、カーソルを表すIDBCursorオブジェクト(変数cursor)が得られる。
③IDBCursorオブジェクトのvalueプロパティから、該当のレコードのオブジェクトが得られる。そして、continue()メソッドを呼び出すことで、カーソルを次のレコードに移動する。
④カーソルの移動が完了するたびに、カーソル準備開始のときに得られたIDBRequestオブジェクト(変数cursorreq)のonsuccessプロパティにセットされたコールバック関数が呼び出される。そのため、読み出しの繰り返し処理を記述する必要はない。