web-dev-qa-db-fra.com

Quelle est la différence entre les interfaces ChildEventListener et ValueEventListener Firebase?

La documentation indique qu'ils écoutent tous les deux les modifications à un emplacement de base de données Firebase.

15
Gil

Ils font presque la même chose, bien que ChildEventListener puisse être parfois plus flexible: avec ChildEventListener vous pouvez spécifier un comportement différent pour 4 actions (onChildAdded, onChildChanged, onChildMoved et onChildRemoved), tandis que ValueEventListener ne fournit que onDataChanged.

ChildEventListener fournit également des DataSnapshots (copies immuables des données) à l'emplacement de l'enfant tandis que ValueEventListener fournit un DataSnapshot d'un nœud entier.

22

ValueEventListener est déclenché uniquement lorsque cette valeur spécifique change, mais ChildEventListener écoute non seulement la valeur de ce nœud, mais également tous les nœuds enfants de l'arborescence. Disons que vous avez un nœud, qui a un enfant. ValueEventListener sera déclenché lorsque ce nœud change, mais ChildEventListener sera également déclenché lorsque de nouvelles valeurs enfants seront également modifiées. La documentation indique que vous devez utiliser ChildEventListener avec prudence - il peut être déclenché plusieurs fois.

7
Alex Shutov

ce sont les principales différences entre les deux

si votre base de données contient les enregistrements suivants:

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

1) sur nouvelle entrée:

  • a) ChildEventListener.onChildAdded sera appelé une fois mais la capture de données n'aura que celle ajoutée
  • b) ValueEventListener.onDatachange sera appelé une fois mais la capture de données aura tout le monde

2) en raison de a) l'obtention du nouveau record dans childeventlistener est

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

en raison de b) obtenir le nouvel enregistrement dans ValueEventListener est

    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();

ainsi, par exemple, si vous ne vous souciez pas de ce qui se passe lorsque quelqu'un supprime le premier dans ValueEventListener, vous êtes toujours averti, mais dans ChildEventListener, vous n'êtes averti que si vous remplacez onChildRemoved.

cela dépend donc de ce que vous voulez faire. par exemple dans une application de chat. vous ne vous souciez que des nouveaux messages, vous ne voulez pas réinsérer tous les messages dans votre salle de chat.

5
luisacevedo