【问题标题】:How to listen for real-time updates on a list of documents in Firestore?如何监听 Firestore 中文档列表的实时更新?
【发布时间】:2020-07-07 08:39:22
【问题描述】:

目前,我正在使用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 个文档的实时更新?谢谢

【问题讨论】:

    标签: java android firebase kotlin google-cloud-firestore


    【解决方案1】:

    Tasks.whenAllSuccess() 返回一个新的 Task 对象,该对象在所有其他任务完成时完成。这根本行不通,因为听众从来没有真正“完成”过。如果您尝试使用侦听器而不是使用 get() 一次性获取,则需要在每个单独的文档引用上设置一个侦听器,如 documentation 所示.

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

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

    完成后不要忘记移除监听器。

    【讨论】:

    • 感谢道格的回答。我考虑过这一点,但是为每个文档附加这么多听众不是很昂贵或不好的做法吗?在我的情况下,有 25 个,但如果我有超过 50 个?
    • 唯一的成本是获取初始数据和所有更新所需的文档读取。有很多听众不是问题。
    • 如果这不是问题,我会继续使用监听器。谢谢。
    【解决方案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,您可以检索集合的实时更新

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

    【讨论】:

    • 谢谢,但这不是我的情况。我不是在听集合或查询。我只有一个DocumentSnapshot 的列表,我将其传递给whenAllSuccess。对于每一个文档,我都需要实时更新。
    • 好吧,我想到的唯一解决方案是为每个文档创建一个 for{} 循环和 addSnapshotListener,但我不确定你在看什么对于
    猜你喜欢
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 2018-11-01
    • 2020-11-30
    相关资源
    最近更新 更多