将 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 时(例如,在 Safari for Windows 或移动浏览器中),当我加载对象时,它们根本不包含PersonId属性。
供参考,_loadPersons
回调如下:
_loadPersons = function () {
_store.getAll(_setPersons);
};
如果我在 Safari 中检查 Web SQL 存储,则有 3 列,key(格式为 1-0、1-1、1-2)、inc(1、2、3)和 value(包含 JSON对象的字符串,缺少PersonId属性。
我不确定内联键功能在 IndexedDB 中是如何工作的,但似乎无论它做什么,它都不会在 Web SQL 中发生。
使用这种方法时,我应该如何引用我想要更新的对象?
我应该只使用外键吗?
是否有其他人实现了 IndexedDB -> Web SQL 结构,如果有,他们使用了哪些库,是否遇到过这个问题?
更新:
我查看了使用 IndexedDB polyfill 的 Indexed DB JQuery 插件示例背后的代码:http: //nparashuram.com/jquery-indexeddb/example/。然而,这个例子中所有的项目都已经有了一个“itemId”,并且它没有任何添加新项目的逻辑,只是将现有项目移动到不同的地方(购物车、愿望清单),所以我只能假设这种方法是一种“外键”方法。
更新 2:
我解决我的情况的方式,使我能够使用 IndexedDBShim 和 IDBWrapper,详细说明如下。然而,更好的解决方案可能是放弃这两个库并尝试其他方法。