【问题标题】:Firebase: How to update some fields out of many without deleting other keys/fields?Firebase:如何在不删除其他键/字段的情况下更新许多字段?
【发布时间】: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 实时数据库项目,所以如果我做了一些非常愚蠢的事情,请提前道歉。

【问题讨论】:

  • 看看文档:Update specific fields
  • 感谢 Renaud,我确实阅读了您指出的文章,但遗憾的是无法真正理解它是如何解决我的用例的。它谈到了使用 updateChildren() 这正是我正在做的。
  • 调用 updateChildren 只会更新您指定的映射中存在的键,而其他子项保持不变。当然,虽然总是有可能有错误潜入产品中,但这似乎不太可能(考虑到这在相当长的一段时间内相对未被触及)。由于您看到不同的行为,我建议您寻找可能仍在调用setValue() 的其他代码。
  • 谢谢弗兰克。我真的希望这是真的,但我再次确认 updateChildren() 确实在刷新 prev 键。

标签: android firebase firebase-realtime-database


【解决方案1】:

经过几个小时的努力,我得出结论,上述用例无法完全按照我的预期实现。

因此我实施了一些调整的方法,希望有一天能帮助有类似需求的人。

我在游戏会话下添加了一个子节点 move,现在我在 move 节点级别执行 updateChildren()。这样我的游戏参数(如 player1 和 player2 信息)是完整的,每次移动时我都会更新 /move 子级。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-24
    • 2017-02-09
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 2013-05-31
    相关资源
    最近更新 更多