我有这个用于Firestore。
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());
}
});
但我不想使用那个循环,而是我只需要获得新的孩子。我想在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 :(得分:5)
您需要在QuerySnapshot对象上使用.getDocumentChanges()
来获取自上次快照以来的更改列表。这相当于实时数据库中的子更改事件。例如:
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;
}
}
}
});
有关详细信息,请参阅https://firebase.google.com/docs/firestore/query-data/listen#view_changes_between_snapshots。
答案 1 :(得分:0)
这就是我实现它的方式。
首先,将DocumentReference初始化为:
DocumentReference mDocRef = FirebaseFirestore.getInstance().document("yourData/notifications");
现在使用mDocRef,调用addSnapshotLisetener()
为DocumentSnapshot创建新的EventListener,如下所示:
mDocRef.addSnapshotListener(new EventListener<DocumentSnapshot>() {
@Override
public void onEvent(DocumentSnapshot documentSnapshot, FirebaseFirestoreException e) {
//todo your code
}
});
因此,这将在您第一次设置数据时以及每次数据更新时获取数据。
此外,如果您将活动作为上下文传递,它将在您的活动停止时自动分离。
..addSnapshotListener(this, new EventListener<DocumentSnapshot>()...