代码之家  ›  专栏  ›  技术社区  ›  svkaka

使用ordeBy()和endBefore()时,Firestore降序分页返回0个结果

  •  0
  • svkaka  · 技术社区  · 7 年前

    我正在研究Firebase Firestore,还有什么比另一个聊天应用更好的示例项目要创建。

    我如何想象它会起作用:

    1. 当用户输入片段时,将获取最新消息
    2. 更新 oldestTimestamp ,将邮件添加到回收器视图
    3. 当用户滚动到顶部时 fecthMore 并获取比当前最旧消息旧的20条消息
    4. 更新 旧时间戳 ,将邮件添加到回收器视图

      阅读后 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
                    }
                }
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   svkaka    7 年前

    与实时数据库中的开始/结束工作不同,因此

    .orderBy("timestamp", Query.Direction.DESCENDING)
    .endBefore(previousOldestMessageTimestamp)
    

    .orderBy("timestamp", Query.Direction.DESCENDING)
    .startAfter(previousOldestMessageTimestamp)
    

    成功了