0

J'ai ceci pour Firestore.Firebase: Firestore: Quel est l'équivalent de ChildEventListener trouvé dans la base de données en temps réel

FirebaseFirestore db = FirebaseFirestore.getInstance(); 
     CollectionReference ref = db.collection("app/appdata/notifications"); 
     ref.addSnapshotListener((snapshot, e) -> { 
      if (e != null) { 
       Log.w(TAG, "Listen failed.", e); 
       return; 
      } 

      for (DocumentSnapshot x : snapshot.getDocuments()) { 
       System.out.println(x.getData()); 
      } 
     }); 

Mais je ne veux pas utiliser cette boucle, mais je n'ai besoin que des nouveaux enfants. Je voudrais quelque chose comme ce qui suit vu dans le Realtime Db.

ref.addChildEventListener(new ChildEventListener() { 
    @Override 
    public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) { 
     Post newPost = dataSnapshot.getValue(Post.class); 
     System.out.println("Author: " + newPost.author); 
     System.out.println("Title: " + newPost.title); 
     System.out.println("Previous Post ID: " + prevChildKey); 
    } 

    @Override 
    public void onChildChanged(DataSnapshot dataSnapshot, String prevChildKey) {} 

    @Override 
    public void onChildRemoved(DataSnapshot dataSnapshot) {} 

    @Override 
    public void onChildMoved(DataSnapshot dataSnapshot, String prevChildKey) {} 

    @Override 
    public void onCancelled(DatabaseError databaseError) {} 
}); 
+0

Toujours dans Firestore, toutes vos données se composent de documents (qui sont essentiellement des magasins de valeurs-clés) et de collections (qui sont des collections de documents). Donc, la base de données en temps réel et Firestore ont des différences fondamentales. –

Répondre

0

Voici comment je l'ai réalisé.

D'abord, init un DocumentReference comme:

DocumentReference mDocRef = FirebaseFirestore.getInstance().document("yourData/notifications"); 

Maintenant, en utilisant votre mDocRef, appelez addSnapshotLisetener() la création de nouvelles EventListener pour la DocumentSnapshot comme ceci:

mDocRef.addSnapshotListener(new EventListener<DocumentSnapshot>() { 
     @Override 
     public void onEvent(DocumentSnapshot documentSnapshot, FirebaseFirestoreException e) { 
      //todo your code 
     } 
    }); 

Donc cela va récupérer vos données première fois que vous mettre en place et aussi chaque fois que les données sont mises à jour.

De même, si vous transmettez votre activité en tant que contexte, elle se détachera automatiquement lorsque votre activité s'arrêtera.

..addSnapshotListener(this, new EventListener<DocumentSnapshot>()... 
+0

Dans votre référence, vous écoutez "sampleData/yourData" et non "sampleData/yourData/notifications". – Relm

+0

sûr, édité que –

+1

Maintenant, cela produira une erreur, la référence doit avoir un nombre impair de chemins. – Relm

4

Vous devez utiliser .getDocumentChanges() sur l'objet QuerySnapshot pour obtenir la liste des modifications depuis la dernière photo. Ceci est équivalent aux événements de changement d'enfant dans la base de données en temps réel. Par exemple:

FirebaseFirestore db = FirebaseFirestore.getInstance(); 
CollectionReference ref = db.collection("app/appdata/notifications"); 
ref.addSnapshotListener((snapshot, e) -> { 
    if (e != null) { 
     Log.w(TAG, "Listen failed.", e); 
     return; 
    } 

    for (DocumentChange dc : snapshots.getDocumentChanges()) { 
     switch (dc.getType()) { 
      case ADDED: 
       // handle added documents... 
       break; 
      case MODIFIED: 
       // handle modified documents... 
       break; 
      case REMOVED: 
       // handle removed documents... 
       break; 
      } 
     } 
    } 
}); 

Voir https://firebase.google.com/docs/firestore/query-data/listen#view_changes_between_snapshots pour plus de détails.