如何在Firestore中的文档列表上侦听实时更新?

发布时间:2020-07-07 08:39

当前,我正在使用get()从Firestore抓取一些文档。这是我的代码:

val ids = getIds()
val tasks: MutableList<Task<DocumentSnapshot>> = mutableListOf()
for (id in ids) {
    tasks.add(collRef.document(id).get())
}
Tasks.whenAllSuccess<DocumentSnapshot>(tasks).addOnCompleteListener { task ->
    if (task.isSuccessful) {
        for (doc in task.result!!) {
            Log.d("TAG", doc.getString("name"))
        }
    }
}

它工作正常。 getIds()返回包含25个ID的列表,因此 Logcat 中的结果为25个名称。但是这段代码仅获取一次数据,这意味着如果添加了某些内容,除非重新加载活动,否则我不会获取它。我读到了listen to multiple documents in a collection的内容,但这是为了与查询一起使用。我尝试过:

Tasks.whenAllSuccess<DocumentSnapshot>(tasks).addSnapshotListener()

但是Android Studio抱怨:

Unresolved reference: addSnapshotListener

如何收听所有25个文档的实时更新?谢谢

回答1

Tasks.whenAllSuccess()返回一个新的Task对象,该对象在所有其他任务完成时完成。这根本无法在这里工作,因为听众实际上并不会“完整”。如果您尝试使用侦听器而不是通过get()进行一次抓取,则需要在每个单独的文档参考上设置一个侦听器,如{ {3}}。

for (id in ids) {
    collRef.document(id).addSnapshotListener { snapshot, e -> 
        // handle the updates here
    }
}

没有“批量监听”操作。每个参考都需要附加一个侦听器。如果需要,可以将相同的documentation对象传递给每个对象,而不是为每个对象创建一个新对象。

完成操作后,别忘了删除监听器。

回答2

我不太了解Kotlin,但是当我需要用Java收听集合时,首先我创建了对文档集合的引用,然后像这样将SnapshotListener添加到集合中

CollectionReference ref = FirebaseFirestore.getInstance().collection("MyCollection");
    ref.addSnapshotListener(new EventListener<QuerySnapshot>() {
        @Override
        public void onEvent(@androidx.annotation.Nullable QuerySnapshot queryDocumentSnapshots, @androidx.annotation.Nullable FirebaseFirestoreException e) {
            //Here use queryDocumentSnapshot to retrieve every document data
        }
    });

使用 queryDocumentSnapshots ,您可以检索有关该消息的实时更新

您还可以使用查询来选择需要收听的文档