我们可以以google official document为例查看集合快照之间的变化:
db.collection("cities")
.whereEqualTo("state", "CA")
.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot snapshots,
@Nullable FirebaseFirestoreException e) {
if (e != null) {
Log.w(TAG, "listen:error", e);
return;
}
for (DocumentChange dc : snapshots.getDocumentChanges()) {
switch (dc.getType()) {
case ADDED:
Log.d(TAG, "New city: " + dc.getDocument().getData());
break;
case MODIFIED:
Log.d(TAG, "Modified city: " + dc.getDocument().getData());
break;
case REMOVED:
Log.d(TAG, "Removed city: " + dc.getDocument().getData());
break;
}
}
}
});
但是如果查询在文档上,我们如何获取DocumentChange
信息:ADDED / MODIFIED / REMOVED?
db.collection("cities")
.document("SF") //Query on document "SF"
.addSnapshotListener(new EventListener<DocumentSnapshot>() {
@Override
public void onEvent(@Nullable DocumentSnapshot documentSnapshot, @Nullable FirebaseFirestoreException e) {
....
}
});
答案 0 :(得分:0)
CollectionReference的addSnapshotListener()方法:
开始收听此查询。
这意味着它将为每个文档更改在该特定集合引用上添加一个侦听器。换句话说,侦听器每次在添加了特定引用的文档上添加,修改或删除文档时都会触发。
同时使用DocumentReference的addSnapshotListener()方法:
开始收听此DocumentReference引用的文档。
这意味着它在单个文档引用上添加了一个侦听器以侦听更改。在这种情况下,侦听器将为文档中添加,修改或删除的每个属性触发。如果您认为会收到有关已更改的特定属性的通知,请注意,这是不可能的。没有字段级权限或对文档的访问。这是整个文档,或者什么也没有。 Cloud Firestore侦听器在文档级别上触发。仅凭文档中的特定字段就无法触发。
答案 1 :(得分:0)
一种可能的解决方法是查询集合中的特定文档: 换行:
.whereEqualTo("state", "CA")
行:
.whereEqualTo(FieldPath.documentId(), "CA")
完整示例:
rootRefs.collection("cities")
.whereEqualTo(FieldPath.documentId(), "CA") //change this line
.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot snapshots,
@Nullable FirebaseFirestoreException e) {
if (e != null) {
Log.w(TAG, "listen:error", e);
return;
}
for (DocumentChange dc : snapshots.getDocumentChanges()) {
switch (dc.getType()) {
case ADDED:
Log.d(TAG, "New city: " + dc.getDocument().getData());
break;
case MODIFIED:
Log.d(TAG, "Modified city: " + dc.getDocument().getData());
break;
case REMOVED:
Log.d(TAG, "Removed city: " + dc.getDocument().getData());
break;
}
}
}
});