【问题标题】:Android Firestore view changes between snapshots from documentAndroid Firestore 视图在文档中的快照之间发生变化
【发布时间】:2019-02-23 03:33:00
【问题描述】:

我们可以从集合中查看快照之间的变化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) {
            ....
            }
        });

【问题讨论】:

    标签: java android firebase google-cloud-firestore


    【解决方案1】:

    CollectionReference 的addSnapshotListener() 方法:

    开始监听这个查询。

    这意味着它会为每个文档更改在该特定集合引用上添加一个侦听器。换句话说,每次在添加的特定引用上添加、修改或删除文档时,侦听器都会触发。

    而 DocumentReference 的 addSnapshotListener() 方法:

    开始侦听此 DocumentReference 引用的文档。

    这意味着它在单个文档引用上添加了一个侦听器以侦听更改。在这种情况下,侦听器会为文档中添加、修改或删除的每个属性触发。如果您认为您会收到更改的特定属性的通知,请注意这是不可能的。没有字段级权限或对文档的访问。这是整个文档,或者什么都没有。 Cloud Firestore 侦听器在文档级别触发。无法仅使用文档中的特定字段触发。

    【讨论】:

      【解决方案2】:

      一种可能的解决方法是从集合中查询特定文档: 换行:

      .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;
                              }
                          }
                      }
                  });
      

      【讨论】:

        猜你喜欢
        • 2019-05-31
        • 1970-01-01
        • 2021-09-27
        • 2022-01-25
        • 1970-01-01
        • 2023-03-19
        • 2020-09-26
        • 2018-03-19
        • 2019-09-03
        相关资源
        最近更新 更多