如何读取Firebase节点的所有子节点并监视更改

时间:2018-05-07 00:00:43

标签: android firebase firebase-realtime-database

我想读取节点的所有子节点,然后跟踪之后发生的任何更改。一个用例可能是本地缓存,我想暂缓使用缓存,直到我知道它已填充。

我能想到的一种方法是首先调用Query.addListenerForSingleValueEvent()来获得初始状态。获得结果后,我知道我的本地缓存已填充,现在我可以调用Query.addChildEventListener()来获取有关添加和删除子项的更新。

然而,这似乎效率低下 - 现在整个儿童列表都被发送过两次,我需要添加一个检查来跳过来自addChildEventListener()的{​​{1}}来自addListenerForSingleValueEvent()的条目

这不是什么大不了的事,但我想知道是否有更好的方法 - 是否有办法简单地调用addChildEventListener()并在所有条目被发送后获得信号?

1 个答案:

答案 0 :(得分:2)

要同时开始同步数据知道初始同步何时完成,您需要添加两个侦听器。

  1. 一个ChildEventListener来处理实际更新。
  2. 一个ValueEventListener来检测何时发送完整更新。
  3. 对于数据库中的初始数据,将首先为每个子节点调用ChildEventListener.onChildAdded。之后,将调用ValueEventListener.onDataChange

    因此,只要onDataChange被调用,就可以知道所有初始数据都已加载。如果您只关心此初始数据是否已完成,则可以使用addSingleValueEventListener注册此侦听器,以便在初始同步后将其分离。

    请注意,Firebase仅传输一次数据,即使该数据有多个侦听器也是如此。因此,如果将两个侦听器连接到同一位置,则只能读取一次数据。