インデックス対照のカラムから前方一致検索
Indexed Database APIでは主キーからでなく、インデックスを設定したカラムの値からも検索できる。
下記に示すサンプルに沿って説明すると、
①まずIDBObjectStoreオブジェクト(変数store)のIndexメソッドを使って、インデックスを表すIDBIndexオブジェクトを取得する。
②次に、IDBKeyRangeオブジェクトのbound()メソッドを使って、IDBKeyRangeオブジェクトを生成する。これが検索条件を表すオブジェクトになる。bound()メソッドの引数に、検索する最小値と最大値を与える。文字列比較になるため、ここでは最小値に”商品11″を、最大値に”商品19″を指定する。
③最後に、IDBIndexオブジェクト(変数index)のopenCursor()メソッドを使って、カーソルの準備を開始する。引数には、IDBKeyRangeオブジェクト(変数range)を指定する。
<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"); // インデックスを取得(IDBIndexオブジェクト) var index = store.index("name_index"); // 検索条件を生成(IDBKeyRangeオブジェクト) var range = IDBKeyRange.bound("商品11","商品19"); // カーソル準備開始(IDBrequestオブジェクト) var cursorreq = index.openCursor(range); // カーソル準備が成功したときの処理 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="resul
IDBKeyRangeオブジェクトを作り替えれば、検索条件を変えることが可能である。このオブジェクトに定義されたメソッドは次の通りである。
メソッド | 説明 |
---|---|
only(value) | 引数valueの値に完全一致するIDBKeyRangeオブジェクトを返す。 |
lowBound(lower) | 引数lower以上の値に一致するIDBKeyRangeオブジェクトを返す。 |
upperBound(upper) | 引数upper以下の値に一致するIDBKeyRangeオブジェクトを返す。 |
bound(lower,upper) | 引数lower以上でかつ引数upper以下の値に一致するIDBKeyRangeオブジェクトを返す。 |