我处于循环中,在其中我向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)
答案 0 :(得分:0)
Safari中存在一个错误,该错误会在低于3的dexie版本中击中Dexie的Modify方法。如果是这种情况,请将dexie升级到最新版本。如果不是那样,请尝试调试并在实际发生修改回调时确定。事务将无济于事,因为所有IDB操作都将通过事务进行,并且您所做的修改决不能覆盖其他事务。