インデックス対照のカラムから前方一致検索
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オブジェクトを返す。 |