【问题标题】:Firebase onChildAdded for new dataFirebase onChildAdded 用于新数据
【发布时间】:2016-01-12 13:39:37
【问题描述】:

如果我有一个包含 50,000 个项目的列表存储在我的 firebase 参考中,并且自上次客户端在线并收听以来已将 5 个项目添加到该列表中,我必须使用哪个回调以便它只被触发对于已添加的 5 个新项目?

我使用Firebase.getDefaultConfig().setPersistenceEnabled(true); 在我的客户端上启用了离线持久性。我有一个监听器绑定到一个监听添加到参考中的孩子的活动。每次创建活动时,都会为引用中的所有数据调用onChildAdded。是否可以仅针对我的本地缓存和 firebase 服务器上的数据之间的“差异”调用 onChildAdded 和 onChildRemoved?或者,如果这不可能,那么在 firebase 的最新更新后仅触发那些 onChild* 回调?

【问题讨论】:

  • 您是否已经尝试使用update() 的 onComplete 回调?
  • 从 android 文档看来,updateChildren() 类似于 setValue()。我不知道如何用它来弄清楚我想要做什么。我在问题中添加了一个示例,这可能会使我想要实现的目标更加清晰。

标签: android firebase firebase-realtime-database


【解决方案1】:

每次创建活动时,都会为引用中的所有数据调用 onChildAdded。是否可以仅针对我的本地缓存和 firebase 服务器上的数据之间的“差异”调用 onChildAdded 和 onChildRemoved?

不,这是不可能的。来自documentation on event types:

child_added 为每个现有的孩子触发一次,然后每次将新的孩子添加到指定路径时再次触发

现在回到你最初的问题:

我必须使用哪个回调才能只为已添加的 5 个新项目触发?

那就是:

ref.limitToLast(5)...

但这要求您知道自从您上次收听以来,列表中添加了多少项目。

更常用的解决方案是跟踪您已经看到的最后一个项目,然后使用 startAt() 从您上次所在的位置开始触发事件:

ref.orderByKey().startAt("-Ksakjhds32139")...

然后,您会保留在共享首选项中看到的最后一个键。

同样,您可以通过以下方式保留上次可见活动的时间:

long lastActive = new Date().getTime();

然后将timestamp 和Firebase.ServerValue.TIMESTAMP 添加到每个项目,然后:

ref.orderByChild("timetstamp").startAt(lastActive+1)...

【讨论】:

  • 这个解决方案还会触发 childChanged 和 childRemoved 事件吗?
  • 虽然弗兰克的回答是绝对正确的,但我认为您应该重新考虑处理 CREATE、UPDATE 和 DELETE 的逻辑(基于他建议的操作)。在我看来,您可以考虑使用基于 Firebase 的 C(R)UD 操作 FIFO 日志(具有过期/驱逐逻辑),以便捕获不同设备离线时发生的所有事情。
  • 是的,自上次查询以来的事件 FIFO 将是最佳的,但看起来我将按原样使用 childEventListener。捕获事件时,我会忽略已经看到的数据,将其存储在本地。
  • 离线删除的项目怎么办?
  • 我喜欢你的上一个解决方案,但是服务器和本地设备之间的时间差异呢?
【解决方案2】:

您应该使用on('child_changed')。通常,on() 用于监听特定位置的数据变化。但是,on('child_changed') 会通知您

当存储在子项(或其任何后代)中的数据发生变化时。

它将数据快照传递给包含新子内容的回调。请记住,单个child_changed 事件可能代表对孩子的多个更改。

【讨论】:

  • 在这种情况下,他不会得到所有 50000 + 5 个项目的列表,而不是他要求的 5 个项目(请参阅问题的最后一段)。
  • 你说得对,我想他也可以使用limitToLast(x) 来获取最后X 个更新的孩子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多