使用db.js查询IndexedDB时,如何获取密钥和值?

时间:2014-05-13 21:00:52

标签: javascript indexeddb db.js

我有一个IndexedDB的变化。我添加这样的项目,然后记录结果以检查密钥是否已成功创建:

_this._idb.add('steps', step).done(function (items) {
        var item = items[0];
        _logger.log("ADDED STEP", { id: item.__id__, step: item }, "CT");
    });

此输出符合预期:

enter image description here

...正如您所看到的,id在存储时已添加到对象中。

但是,当我使用以下代码查询数据库以获取对象列表时:

this._idb.steps.query('timestamp').bound(start, end).execute().done(function (results) {
        _logger.log("Results", results, "CT");
    }

我没有将id作为返回对象的一部分:

enter image description here

...而且缺少id会使更新和删除变得不可能。

当我使用db.js查询索引数据库时,如何获取项目的ID - 或者我是以错误的方式接近它,还有其他我应该做的事情吗?

(注意:我正在使用TypeScript编译JS,但我不认为这与此问题特别相关)

3 个答案:

答案 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的目标简单易用。您是高级用例。