ほとんどのチュートリアルでは、オブジェクト ストアからすべてのレコードをカーソルで反復処理して取得する方法が示されています。しかし、キー "myKey" を使用してオブジェクト ストアから値を取得するにはどうすればよいでしょうか。
2 に答える
単純なキー/値ストレージを探している場合は、を検討することをお勧めしますlocalStorage
。IndexedDBを使用するよりもはるかに簡単です。これは(これまでのところ)文字列でのみ機能しますが、オブジェクトはJSONオブジェクトを介して簡単に文字列化されます。
console.log( 'BEFORE', localStorage.getItem( 'test-key' ) );
localStorage.setItem( 'test-key', JSON.stringify( { 'foo': Math.round( Math.random() * 1000 ) } ) );
console.log( 'AFTER', JSON.parse( localStorage.getItem( 'test-key' ) ) );
とはいえ、キーまたはキーの範囲に対して複数の値を取得する必要がある場合にのみ、IndexedDBのキーから単一の値を取得するためにカーソルは必要ありません。キーから値を取得するには、次の2つのいずれかを実行します。
1)myKey
が主キーの場合(ストアの作成時に追加):
var request = transaction.get( key );
onsuccess
次に、 andコールバックを追加してonerror
、結果のイベントオブジェクトを解析し、そこから値を抽出しevent.target.result
ます。
2)myKey
が非プライマリインデックス(ストアの作成後に追加したもの)にある場合は、トランザクションでインデックスを開き、次にインデックスでカーソルを開きます。
var transaction_index = transaction.index( index );
var request = transaction_index.get( key );
カーソル(同じキーの下に複数の値が格納されている場合は常にカーソルが必要になるため、よく説明されます)については、それらを使用して単一のキーの値を取得することもできます。スペックは言う:
キー範囲は、単一の値で構成されている場合があります。
keyRange
オブジェクトを使用してを生成する必要がありIDBKeyRange
ます。これは、 MITライセンスのInDB (私の進行中のIndexedDBラッパー)からのヘルパーメソッドです。これは、単一の値(たとえばInDB.range.get( value )
)またはキー範囲でカーソルを開くことを処理します。
InDB.range.get = function ( value, left_bound, right_bound, includes_left_bound, includes_right_bound ) {
if ( InDB.exists( left_bound ) && InDB.exists( right_bound ) && InDB.exists( includes_left_bound ) && InDB.exists( includes_right_bound ) ) {
return IDBKeyRange.bound( left_bound, right_bound, includes_left_bound, includes_right_bound );
} else if ( InDB.exists( left_bound ) && InDB.exists( includes_left_bound ) ) {
return IDBKeyRange.lowerBound( left_bound, includes_left_bound );
} else if ( InDB.exists( right_bound ) && InDB.exists( includes_right_bound ) ) {
return IDBKeyRange.upperBound( right_bound, includes_right_bound );
} else if ( InDB.exists( value ) ) {
return IDBKeyRange.only( value );
} else {
return false;
}
}
を取得したらkeyRange
、次の2つのいずれかを実行します。
1)myKey
が主キー(ストアの作成時に追加)の場合、トランザクションで通常のカーソルを開きます(オプションの方向を使用)。
var request = transaction.openCursor( keyRange, direction );
2)myKey
が非プライマリインデックス(ストアの作成後に追加したもの)にある場合は、トランザクションでインデックスを開き、次にインデックスでカーソルを開きます。
var transaction_index = transaction.index( index );
var request = transaction_index.openCursor( keyRange, direction );