6

ほとんどのチュートリアルでは、オブジェクト ストアからすべてのレコードをカーソルで反復処理して取得する方法が示されています。しかし、キー "myKey" を使用してオブジェクト ストアから値を取得するにはどうすればよいでしょうか。

4

2 に答える 2

9

単純なキー/値ストレージを探している場合は、を検討することをお勧めします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 );
于 2011-11-29T02:30:55.710 に答える