在特定日期之后获取所有Firestore文档

时间:2018-05-06 19:22:55

标签: android firebase kotlin google-cloud-firestore real-time-updates

我尝试完成的工作如下:我有一个集合,其中添加了时间戳的文档。然后我想通过snapshotlistener监听该集合,但仅针对新文档。所以我将我的时间戳更新为收到的最新文档时间戳,并尝试仅查询比我的时间戳更新的文档。在onCreate中,我为lastUpdateTime分配了一个过去的日期,以便我添加第一个文档。

val sdf = SimpleDateFormat("dd/MM/yyyy", Locale.US)
    try {
        lastUpdateTime = sdf.parse("01/01/2000")

    } catch (e: ParseException) {
       //
    }

然后我添加snapshotlistener并尝试更新lastUpdateTime,以便只查找比此日期/时间更新的文档

val path = //...path to my collection
private var lastUpdateTime = Any() //my up-to-date timestamp. I first assign it some date in the past, to make sure it gets the first document added.
// some code

talksListener = path.whereGreaterThan("timestamp", lastUpdateTime)
                .addSnapshotListener(EventListener<QuerySnapshot> { snapshot, e ->

                    if (snapshot != null && !snapshot.isEmpty && !snapshot.metadata.hasPendingWrites()) {                            

                        for (dSnapshot in snapshot) {
                            val thisTimestamp = dSnapshot.get("timestamp")    

                            if (thisTimestamp != null) {
                                lastUpdateTime = thisTimestamp
                            }  
                        }
                    }
                })

但每次添加文档时,我都会再次收到整个集合。 我还尝试了orderBystartAt/endAt/startBefore/EndBefore的所有组合,但结果是一样的。每次添加新文档时,我都得不到任何结果,或者整个集合。 例如:

talksListener = path.orderBy("timestamp").startAfter(lastUpdateTime)

这里的问题在哪里? 另外,在另一个注释中,是否有可能将!snapshot.metadata.hasPendingWrites()包含在Kotlin的查询中。 documentation说要使用MetadataChanges.INCLUDE,但我不知道如何在Kotlin中实现它。每个提示都非常感激。

编辑1: 我的firestore DB的结构如下:

users/{user}/messages/{message} -> here is the timestamp located

我的路径指向./messages

编辑2: 解决方案是在分配新的lastUpdateTime后分离并重新附加侦听器。这对我来说听起来不太好,所以如果有人有更好的解决方案,我很高兴听到它。暂时我会坚持下去。

0 个答案:

没有答案