如何在Dexie中添加多个嵌套对象键?

时间:2020-10-05 09:41:15

标签: dexie

我处于循环中,在其中我向indexeddb行添加了几个新键(大约1到3)。 dexie表如下:

{
    event_id: <event_id>
    <event data>
    groups: {
       <group_id> : { group_name: <name>, <group data> }
    }
}

我使用Dexie的Modify()回调在循环中添加密钥:

newGroupNr++
db.event.where('event_id').equals(event_id).modify(x => x.groups[newGroupNr]=objData)

objData是包含一些组属性的简单对象。

但是,通过这种方式,当我添加两个或三个组时,实际上只有一个组被写入数据库。我试过将它们包装在transaction()中,但是没有运气。

我觉得问题是modify()调用彼此重叠,因为它们异步运行。不知道这是否成立,也不确定如何处理这种情况。

Dexie Modify(): https://dexie.org/docs/Collection/Collection.modify()

相关: Dexie : How to add to array in nested object

编辑:我发现了问题,它与Dexie无关。但是,我不完全理解为什么此修复程序有效,也许与javascript中的所有内容都是通过引用而不是值传递的?我的理论是,将整数newGroupNr值作为参考传递,并在循环的下一个迭代中(在Dexie能够完成之前)进行递增,从而实际上导致了两次创建相同的键。这样就解决了:

newGroupNr++
let newGroupNrLocal = newGroupNr
db.event.where('event_id').equals(event_id).modify(x => x.groups[newGroupNrLocal]=objData)

1 个答案:

答案 0 :(得分:0)

Safari中存在一个错误,该错误会在低于3的dexie版本中击中Dexie的Modify方法。如果是这种情况,请将dexie升级到最新版本。如果不是那样,请尝试调试并在实际发生修改回调时确定。事务将无济于事,因为所有IDB操作都将通过事务进行,并且您所做的修改决不能覆盖其他事务。