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

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

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

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

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

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

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

  -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 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 map = (Map)data.getValue(); String message = map.get("message").toString(); 

所以例如,如果您不关心当有人删除ValueEventListener中的第一个时发生的事情,您总会得到通知,但在ChildEventListener中,只有覆盖onChildRemoved才会收到通知。

所以这取决于你想做什么。 例如在聊天应用中。 您只关心新邮件,不想再在聊天室中重新插入所有邮件。