【发布时间】:2021-09-10 23:10:16
【问题描述】:
经过几个小时的研究和阅读了几篇文章,我仍然不清楚如何才能实现我想要的。我找到的最接近的是:Firebase: How to set value to child without updating/deleting subChildren?,但这也不能满足我的需要。
我的需求很简单。在 firebase RealTime DB 中,我尝试将其用于 2 人游戏。
我在游戏开始时创建了一个“游戏会话”键,并在其中添加了几个字段,例如 player1、player2、开始时间:
Map<String, Object> dbUpdates = new HashMap<>();
dbUpdates.put("player1", player1Id);
dbUpdates.put("player2", player2Id);
dbUpdates.put("game_started", true);
myRef.child("Games").child(game_session).updateChildren(dbUpdates);
然后,当第一步完成后,我想添加更多的键/值,如移动、下一步移动、游戏结束状态等到同一个游戏会话:
我这样做是:
Map<String, Object> dbUpdates = new HashMap<>();
dbUpdates.put("nextMove", player1ID);
dbUpdates.put("move", "1,1");
dbUpdates.put("game_over", false);
myRef.child("Games").child(game_session).updateChildren(dbUpdates);
不,我的期望是所有的键都可用,包括在游戏开始时添加的键,但是当第二个 updateChilderen 被调用时,我失去了 prev 键值,最后只有新的键值:
我可以为第一步添加的每个新键使用 setValues(),这意味着侦听器将被触发 3 次,并将 3 个碎片更新推送到数据库,这是我想避免的。非常感谢任何指导,这是我的第一个 firebase 实时数据库项目,所以如果我做了一些非常愚蠢的事情,请提前道歉。
【问题讨论】:
-
感谢 Renaud,我确实阅读了您指出的文章,但遗憾的是无法真正理解它是如何解决我的用例的。它谈到了使用 updateChildren() 这正是我正在做的。
-
调用
updateChildren只会更新您指定的映射中存在的键,而其他子项保持不变。当然,虽然总是有可能有错误潜入产品中,但这似乎不太可能(考虑到这在相当长的一段时间内相对未被触及)。由于您看到不同的行为,我建议您寻找可能仍在调用setValue()的其他代码。 -
谢谢弗兰克。我真的希望这是真的,但我再次确认 updateChildren() 确实在刷新 prev 键。
标签: android firebase firebase-realtime-database