11

キーが既に存在する場合、IndexedDB objectStore へのオブジェクトの追加は失敗します。特定のキーを持つオブジェクトの存在を確認するにはどうすればよいですか。できれば同期的に (別のレイヤーのコールバックを行う必要はありません)、オブジェクトをプルする必要はありません。

トランザクションを介して非同期でリクエストを取得する方法は知っていますが、オブジェクトを追加するたびに実行するのは少し大変なようです。

noteソリューションは Chrome でのみ動作する必要があります (それが役立つ場合)

4

4 に答える 4

17

キーの存在を確認する最良の方法は、objectStore.count(key) です。これは非同期です。

あなたの場合、最良のオプションはキーの openCursor です。存在する場合、カーソルが表示されます。

var req = objectStore.openCursor(key);
req.onsuccess = function(e) {
  var cursor = e.target.result; 
  if (cursor) { // key already exist
     cursor.update(obj);
  } else { // key not exist
     objectStore.add(obj)
  }
};
于 2013-03-10T00:55:11.233 に答える
8

答えには少し遅れますが、他の人に役立つ可能性があります。私はまだ同じ問題につまずいた-私が推測するように-しかし、それは非常に簡単です:

使用するレコードを INSERT または UPDATE したい場合objectStore.put(object) (ヘルプ)
使用するレコードを INSERT のみしたい場合objectStore.add(object) (ヘルプ)

したがって、 を使用add(object)し、レコード キーがまだ DB に存在する場合、上書きされず、エラー 0 "ConstraintError: Key already exists in the object store" が発生します。

を使用put(object)すると上書きされます。

于 2016-04-24T09:28:09.390 に答える
8

これまでのところ、同期 API が実装されているブラウザーはありません。そのため、非同期で行う必要があります。Anは、キーを提供するメソッドをobjectStore公開getし、キーに一致するオブジェクト (または null) を返します。

IDB の使用をカバーする MDN に関する非常に優れたチュートリアルがあり、レコードの取得もカバーされていますが、インライン コードは次のとおりです。

db.transaction("customers").objectStore("customers").get("444-44-4444").onsuccess = function(event) {
  alert("Name for SSN 444-44-4444 is " + event.target.result.name);
};

レコードを取得したくない場合は、ここで仕様でcount説明されているように、いつでもインデックスでメソッドを使用できます。レコードを使用または変更できる結果に基づいて、必要がない場合はレコードの抽出を節約できます。addput

于 2013-03-10T23:47:35.327 に答える
1

問題は、なぜこれを知りたいのですか?たぶん、別のアプローチを使用する必要がありますか?

自動インクリメントを使用できます。これにより、キーが存在するかどうかを確認する必要がなくなり、常に一意のキーが取得されます。

add メソッドの代わりに put メソッドを使用することもできます。put を使用すると、キーが存在する場合はデータが更新され、キーが存在しない場合はデータが追加されます。

すべては、何かが存在するかどうかを確認する理由によって異なります。

于 2013-03-11T09:31:05.613 に答える