我正在研究Firebase Firestore,还有什么比另一个聊天应用更好的示例项目要创建。
我如何想象它会起作用:
-
当用户输入片段时,将获取最新消息
-
更新
oldestTimestamp
,将邮件添加到回收器视图
-
当用户滚动到顶部时
fecthMore
并获取比当前最旧消息旧的20条消息
-
更新
旧时间戳
,将邮件添加到回收器视图
阅读后
order-limit-data
和
query-cursors
我想出了那些解决办法,可惜没有一个奏效。
我用过
whereLessThanOrEqualTo("timestamp", previousOldestMessageTimestamp)
但这返回了0条消息
之后,我试着用
.orderBy("timestamp", Query.Direction.DESCENDING) .endBefore(previousOldestMessageTimestamp)
结果和以前一样
然后我试着将查询简化为
.orderBy("timestamp") .endBefore(previousOldestMessageTimestamp)
它返回了一些消息,但在列表中是整个对话中最早的消息
我应该做些什么才能让它正常工作(就像每个聊天应用一样)?
你也能解释一下
whereLessThanOrEqualTo()
和
orderBy()
+
endBefore()
这里有一些背景
private var previousOldestMessageTimestamp: Long = -1
private fun firstFetch(){
//get oldest messages
//update previousOldestMessageTimestamp to oldest message timestamp
}
private fun fetchMore() {
val conversationRef = FirebaseFirestore.getInstance()
.document("conversations")
.collection("some_id")
conversationRef
.whereLessThan("timestamp", previousOldestMessageTimestamp)
//^ 0 messages
.orderBy("timestamp", Query.Direction.DESCENDING)
.endBefore(previousOldestMessageTimestamp)
//^ returns 0 messages
.orderBy("timestamp")
.endBefore(previousOldestMessageTimestamp)
//^ returns messages but starts with oldest one,
//not what I want
.limit(20)
.get().addOnCompleteListener { it: Task<QuerySnapshot!>
val messages: List<Message> = it.result.map { it.toObject(Message::class.java) }
println("I fetched ${messages.size} messages : $messages")
if (messages.isNotEmpty()) {
previousOldestMessageTimestamp = *oldestMessage*.timestamp
}
}
}