当前,我正在使用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个文档的实时更新?谢谢
Tasks.whenAllSuccess()
返回一个新的Task对象,该对象在所有其他任务完成时完成。这根本无法在这里工作,因为听众实际上并不会“完整”。如果您尝试使用侦听器而不是通过get()
进行一次抓取,则需要在每个单独的文档参考上设置一个侦听器,如{ {3}}。
for (id in ids) {
collRef.document(id).addSnapshotListener { snapshot, e ->
// handle the updates here
}
}
没有“批量监听”操作。每个参考都需要附加一个侦听器。如果需要,可以将相同的documentation对象传递给每个对象,而不是为每个对象创建一个新对象。
完成操作后,别忘了删除监听器。
我不太了解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 ,您可以检索有关该消息的实时更新
您还可以使用查询来选择需要收听的文档