IndexedDB shim を Web SQL に使用すると、レコードを更新できませんでした: https://github.com/axemclion/IndexedDBShim
IDBWrapper も使用しています: https://github.com/jensarps/IDBWrapper
私はこれらのライブラリを使用していますが、私の質問は依然として適切である可能性があり、IndexedDB と Web SQL の一般的な使用法に関連している可能性があるため、適切にアドバイスされる可能性があると考えています。
インライン キーを使用して、IndexedDB ストレージを実装しています。
_store = new IDBStore({
storeName: 'person',
keyPath: 'PersonId',
autoIncrement: true,
onStoreReady: _loadPersons
});
オブジェクトをストアに保存すると...
_store.put(person, _loadPersons);
...自動インクリメントキーを生成し、このキー値を「keyPath」プロパティにちなんで名付けられたオブジェクトに自動的に保存します。この場合はPersonIdです。
これはうまくいきます。Chrome で IndexedDB ストレージを調べると、2 つの列があります。キー (キー パス: 'PersonId') と値 (オブジェクトを含む)。
同じオブジェクトを更新したい場合は、PersonIdという名前のプロパティが含まれていること、および保存したいキーと同じ値を持っていることを確認するだけで、更新されます。
ただし、Web SQL に保存する IndexedDB shim を使用する場合 (Windows の Safari やモバイル ブラウザーなど)、オブジェクトを読み込むと、PersonIdプロパティがまったく含まれません。
参考までに、_loadPersons
コールバックは次のとおりです。
_loadPersons = function () {
_store.getAll(_setPersons);
};
Safari で Web SQL ストレージを調べると、キー (1-0、1-1、1-2 の形式)、inc (1、2、3)、および値 (JSON を含む) の 3 つの列があります。オブジェクトの文字列、PersonIdプロパティがありません。
インライン キー機能が IndexedDB でどのように機能するかはわかりませんが、それが何であっても、Web SQL では発生しないようです。
このアプローチを使用する場合、更新したいオブジェクトをどのように参照すればよいですか?
規格外のキーを使用する必要がありますか?
他の誰かが IndexedDB -> Web SQL 構造を実装しましたか?もしそうなら、彼らはどのライブラリを使用し、この問題に遭遇しましたか?
アップデート:
IndexedDB polyfill: http://nparashuram.com/jquery-indexeddb/example/を使用した Indexed DB JQuery プラグインの例の背後にあるコードを見てきました。ただし、この例では、すべてのアイテムに既に「itemId」があり、新しいアイテムを追加するためのロジックはなく、既存のアイテムを別の場所 (カート、ウィッシュリスト) に移動するだけなので、このアプローチは「アウトオブラインキー」アプローチ。
更新 2:
IndexedDBShim と IDBWrapper を使用できるようにするために、状況を解決した方法については、以下の回答として詳しく説明します。ただし、おそらくより良い解決策は、これら 2 つのライブラリを捨てて、別の方法を試すことです。