我尝试完成的工作如下:我有一个集合,其中添加了时间戳的文档。然后我想通过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
}
}
}
})
但每次添加文档时,我都会再次收到整个集合。
我还尝试了orderBy
和startAt/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后分离并重新附加侦听器。这对我来说听起来不太好,所以如果有人有更好的解决方案,我很高兴听到它。暂时我会坚持下去。