【问题标题】:Firestore Pagination : StartAfter query with DocumentSnapshot not workingFirestore 分页:使用 DocumentSnapshot 的 StartAfter 查询不起作用
【发布时间】:2020-01-15 21:39:36
【问题描述】:

我的 Firestore 数据库中保存了一份优惠/交易列表。我想按 desc 顺序获取按折扣排序的前 3 个交易,即折扣最高的交易首先出现,然后是下一个最高的交易,依此类推。我将它们分成 3 段来获取。

我正在尝试使用 android 代码来实现相同的目标。因此,折扣为 55、44、28 的前 3 个元素应该先出现,然后是 27、27、21,最后是 19,4。

class ContentGenerationActivityV1 : AppCompatActivity() {

     var lastDocument : DocumentSnapshot?= null
     lateinit var filterQuery: Query

     override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_content_generation)

        val doc = FirebaseFirestore.getInstance().collection("steal-deals").document("deals")

       filterQuery = doc.collection(getTodayTimeStamp().toString())
        .orderBy("discount", Query.Direction.DESCENDING)

       filterFetchButton.setOnClickListener {
           if(lastDocument == null){
              fetchFirstFew()
           } else {
            fetchMore()
        }
    }
}

//Get first 3 elements
fun fetchFirstFew(){

    Log.d("N/W CALL ::", "FIRST")

    filterQuery.limit(3) .get()
        .addOnSuccessListener { result ->

            lastDocument = result.documents.last()

            for (document in result) {
                Log.d("DEAL :: ", "${document.id} => ${document.data}")
            }

        }


}

//Get the next 3 elements
fun fetchMore(){

    Log.d("N/W CALL ::", "SECOND")

    filterQuery.startAfter(lastDocument)
        .limit(3).get()
        .addOnSuccessListener { result ->

            lastDocument = result.documents.last()

            for (document in result) {
                Log.d("DEAL :: ", "${document.id} => ${document.data}")
            }


        }
}

但无论如何它总是返回前三个元素(55,44,28)。

请指导我实现同样的目标。

【问题讨论】:

  • 签出this。在 Java 中,但我想你会明白的。这是一个简单的例子。
  • 代码乍一看还不错。您可能想在fetchMore 中设置一个断点并在调试器中运行它,以查看lastDocument 是否具有正确的值。
  • 我检查了两次lastDocument 值,我可以确认该值是正确的。
  • 您找到解决方案了吗?我也有同样的问题

标签: android firebase kotlin google-cloud-firestore


【解决方案1】:

我遇到了同样的问题,但经过一些研究发现“startAfter(lastDocument)”返回一个您需要获取的新查询实例,并且您需要调用限制。

val query = filterQuery.startAfter(lastDocument)
query.limit(3).get().addOnSuccessListener {}

【讨论】:

  • 非常感谢,我以为 startAfter 正在改变现有的
【解决方案2】:

我刚遇到这个问题。

reference

所以,在你的代码中

错误:

filterQuery.limit(3) .get()
        .addOnSuccessListener { result ->

            lastDocument = result.documents.last()

            for (document in result) {
                Log.d("DEAL :: ", "${document.id} => ${document.data}")
            }

        }

正确:

filterQuery = filterQuery.limit(3) .get()
        .addOnSuccessListener { result ->

            lastDocument = result.documents.last()

            for (document in result) {
                Log.d("DEAL :: ", "${document.id} => ${document.data}")
            }

        }

因为当您链接到查询时,它会创建并返回一个新查询,该查询在提供的文档之后开始(独占)。所以你必须重新分配它!

【讨论】:

    猜你喜欢
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    相关资源
    最近更新 更多