我有一个IndexedDB的变化。我添加这样的项目,然后记录结果以检查密钥是否已成功创建:
_this._idb.add('steps', step).done(function (items) {
var item = items[0];
_logger.log("ADDED STEP", { id: item.__id__, step: item }, "CT");
});
此输出符合预期:
...正如您所看到的,id在存储时已添加到对象中。
但是,当我使用以下代码查询数据库以获取对象列表时:
this._idb.steps.query('timestamp').bound(start, end).execute().done(function (results) {
_logger.log("Results", results, "CT");
}
我没有将id作为返回对象的一部分:
...而且缺少id会使更新和删除变得不可能。
当我使用db.js查询索引数据库时,如何获取项目的ID - 或者我是以错误的方式接近它,还有其他我应该做的事情吗?
(注意:我正在使用TypeScript编译JS,但我不认为这与此问题特别相关)
答案 0 :(得分:3)
这是预期的行为,如果您don't define a keyPath
in your db schema,您只会获得__id__
财产。
因为没有keyPath
定义了该值与indexeddb 中的没有关联,所以只有在添加后才将其添加到结果对象中,因为在那个时间点我们知道IndexedDB为其分配的自动递增值。
由于该值实际上并不是对象的一部分,因此在查询过程中它没有任何方法可以将它分配给对象,也许我可以使用数组中的位置但是& #39;更可能是错误而不是正确。
如果您希望将ID保留在对象上,那么您需要define a keyPath
as part of the object store schema,该属性将为added to the resulting object and available,并且它将位于对象returned from a query上。
免责声明 - 我写过db.js
答案 1 :(得分:2)
查看来源,当您的keyPath为__id__
defined 时,null
仅为in the add()
method。从我所看到的情况来看,您永远不会在query()
回复中看到这一点。
在IDB中,仅当使用自动递增("行外")键时才允许keyPath
。因此,如果您要将对象取回,则应该在其上或其他keyPath
上设置自动递增键。
JavaScript中的__
前缀通常意味着开发人员希望它是一个私有的"属性。我猜这是供内部使用的,你不应该在你的应用程序代码中指望它。
考虑使用明确的,所谓的" in-line"对象库上的键。
答案 2 :(得分:-3)
db.js的目标简单易用。您是高级用例。