Android Firestore视图在文档快照之间进行更改

时间:2019-02-23 03:33:00

标签: java android firebase google-cloud-firestore

我们可以以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) {
            ....
            }
        });

2 个答案:

答案 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;
                        }
                    }
                }
            });