Я пытаюсь сделать следующее: у меня есть коллекция, в которую добавляются документы с отметкой времени. Затем я хочу прослушать эту коллекцию через 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. документация говорит, что нужно использовать MetadataChanges.INCLUDE
, но я не понимаю, как реализовать это в Kotlin. Каждый Намек очень ценится.
изменить 1:
Моя база данных Firestore имеет следующую структуру:
users/{user}/messages/{message} -> here is the timestamp located
и мой путь ведет к ./messages
редактировать 2:
Решение состоит в том, чтобы отсоединить и снова подключить прослушиватель после назначения нового lastUpdateTime. Это не звучит хорошо для меня, поэтому, если у кого-то есть лучшее решение, я буду рад его услышать. Пока же я буду придерживаться этого.