Firebase Android ChildEventListener 在被规则拒绝时触发 (RTDB)

Firebase Android ChildEventListener fires when denied by rules (RTDB)

提问人:hgh89 提问时间:11/1/2023 更新时间:11/1/2023 访问量:21

问:

我有一个游戏,其中两个客户端都可以通过写入“游戏结束”节点来确定“游戏结束”状态:

- gameId
- - gameUpdates
- - gameover

我将 ChildEventListener 附加到“gameId”,当快照出现时,我会确定快照的密钥并采取相应的行动。

由于游戏可以以各种方式结束,因此我只希望第一次写入“gameover”,以确保游戏对两个玩家都以相同的方式结束。因此,在RTDB规则中,我为“游戏结束”设置了规则。!data.exists()

对于我的问题: 如果我对“gameover”的写入被规则拒绝(其他玩家已经向这个节点写入了一些东西),那么我仍然会得到一个包含我写入的数据的本地快照,即使它从未写入数据库。

现在,我通过@puf知道了这个答案,如果你用 ServerValue.TIMESTAMP 编写一些东西,你会得到一个本地快照和一个实际快照。这是预期的行为,但我没有在这里写任何时间戳。

我想知道的是:这种行为与时间戳写入相同吗?有没有办法忽略本地快照?也对其他想法持开放态度,以使这项工作:)

提前感谢您的任何帮助!

Android Firebase -实时数据库 Firebase -安全性

评论

0赞 Frank van Puffelen 11/1/2023
我在下面写了一个解释,但它可能取决于实际代码:“寻求调试帮助的问题('为什么这个代码不起作用?必须包括所需的行为、特定问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用。请参阅:如何创建最小、完整和可验证的示例“和构建最小、完整、可重现的示例

答:

0赞 Frank van Puffelen 11/1/2023 #1

如果应用程序写入数据库,则本地 SDK 始终会立即触发该写入事件,甚至在将其发送到服务器之前也是如此。无法抑制这些事件。


如果写入随后被服务器拒绝,SDK 将触发所谓的协调事件,以允许您更新应用的本地状态。

因此,例如,如果您添加了一个子项,则初始事件将为 .如果服务器拒绝此写入,SDK 将触发以允许您修复本地状态。onChildAddedonChildRemoved