簡體   English   中英

ChildEventListener和ValueEventListener Firebase接口有什么區別?

[英]What is the difference between ChildEventListener and ValueEventListener Firebase interfaces?

文檔說他們都在Firebase數據庫位置收聽更改。

他們這樣做幾乎同樣的事情,雖然ChildEventListener可有時更靈活:與ChildEventListener可以指定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<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才會收到通知。

所以這取決於你想做什么。 例如在聊天應用中。 您只關心新郵件,不想再在聊天室中重新插入所有郵件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM