ChildEventListener和ValueEventListener Firebase接口有什么区别?

时间:2016-11-23 12:14:07

标签: android firebase firebase-realtime-database

文档说它们都会在Firebase数据库位置收听更改。

3 个答案:

答案 0 :(得分:21)

它们几乎完全相同,但ChildEventListener有时可以更灵活:使用ChildEventListener,您可以为4个操作指定不同的行为(onChildAddedonChildChangedonChildMovedonChildRemoved),而ValueEventListener仅提供onDataChanged

ChildEventListener还在子位置提供DataSnapshots(数据的不可变副本),而ValueEventListener提供整个节点的DataSnapshot。

答案 1 :(得分:7)

只有在特定值发生更改时才会触发ValueEventListener,但ChildEventListener不仅会侦听该节点的值,还会侦听树的所有子节点。比如说,你有节点,它有一个孩子。 当此节点更改时,将触发ValueEventListener,但也会触发更新子级值的ChildEventListener。文档说,你应该谨慎使用ChildEventListener - 它可以被触发很多次。

答案 2 :(得分:5)

这些是两者之间的主要区别

如果您的数据库有以下记录:

  -LDU4T1buanVuJrpOYxW
      message:"hi stack"
      user: "john"
  -LDasdfa1buanVuJrpOYxW
      message:"hi john"
      user: "stack"

1)关于新条目:

  • a)ChildEventListener.onChildAdded将被调用一次        但是数据快照只会添加一个
  • b)ValueEventListener.onDatachange将被调用一次           但数据快照将包含所有人

2)因为a)在childeventlistener中获取新记录是

 public void onChildAdded(DataSnapshot dataSnapshot, String s) {
    Map<String,String> map =(Map) dataSnapshot.getValue();
    String message = map.get("message").toString();

因为b)在ValueEventListener中获取新记录是

    public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot data : dataSnapshot.getChildren()) {
               .... loop until end
                Map<String,String> map = (Map)data.getValue();
                String message = map.get("message").toString();

所以例如,如果你不关心当有人删除第一个时会发生什么     在ValueEventListener中,您始终会收到通知     但是在ChildEventListener中,只有覆盖才会收到通知        onChildRemoved。

所以这取决于你想做什么。例如在聊天应用中。你会的  关心新消息,您不希望再次重新插入所有消息  聊天室。