2011-11-24 23 views
4

ほとんどのトーナリーでは、オブジェクトストアからすべてのレコードをカーソルで反復して取り出す方法が示されています。 しかし、キー "myKey"を使ってオブジェクトストアから値を取得するにはどうすればよいですか?Html5 IndexedDB - キーで値を取得する

答えて

5

単純なキー/値のストレージをお探しの場合は、localStorageと考えてください。 IndexedDBを使用するよりもはるかに簡単です。これは文字列(これまでのところ)でのみ動作しますが、オブジェクトはJSONオブジェクトを介して簡単に文字列化されます。

あなたは、キーのキーまたは範囲に複数の値を取得する必要がある場合にのみ、のIndexedDBでキーから単一の値を取得するには、カーソルを必要としない、と述べた
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'))); 

。キーから値を取得するには、次の2つのいずれかの操作を行います。

1)myKeyがあなたの主キー(ストアを作成するときに追加された)の場合:

var request = transaction.get(key); 

その後、onsuccessonerrorを追加することができますコールバックを使用して、event.target.resultの値を抽出するイベントオブジェクトを解析します。

2)myKeyが非プライマリインデックス(ストアの作成後に追加したもの)にある場合は、トランザクションでインデックスを開き、インデックスにカーソルを表示します。 (あなたはおそらくあなたが同じキーの下に格納された複数の値を持つたびに1が必要になりますので、より頻繁に議論を参照)カーソルのよう

var transaction_index = transaction.index(index); 
var request = transaction_index.get(key); 

、あなたにも、単一のキーに対する値を取得するために、これらを使用することができます。 the spec言う:

A key range may consist of a single value.

あなたはIDBKeyRangeオブジェクトを使用してkeyRangeを生成する必要があります。ここでは、MIT-licensed 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); 
+0

「var request = transaction.get(key);」と思われます。 "Uncaught TypeError:Object#にはメソッド 'get'がありません。私はあなたが書いたように、トランザクションではなくobjectStore上で.get()メソッドを呼び出す必要があると思います。そうですか? – Matthew

+0

トランザクションを介してのみオブジェクトストアデータにアクセスできますが、 'objectStore'で' get() 'を呼び出すのは正しいです。 'transaction'のvar宣言はここでは示されていませんが、' event.objectStore(database) 'のようなものです。 – buley

+0

注目すると、データベース(http://www.w3.org/TR/IndexedDB/#idl-def-IDBDatabase)上のトランザクションを「var event = database」で開きます。トランザクション([データベース]、タイプ、タイムアウト); – buley

関連する問題