簡體   English   中英

Firestore 分頁:StartAfter 查詢與 DocumentSnapshot 不工作

[英]Firestore Pagination : StartAfter query with DocumentSnapshot not working

我的 firestore 數據庫中保存了一份報價/交易列表。 我想獲取按降序折扣排序的前 3 筆交易,即折扣最高的交易排在第一位,然后是次高的,依此類推。 我以 3 段的形式獲取它們。

我如何對它們進行分類 firebase 控制台

我根據折扣排序的數據庫

我正在嘗試使用 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)。 在此處輸入圖像描述

請指導我實現同樣的目標。

我遇到了同樣的問題,但經過一些研究發現“startAfter(lastDocument)”返回一個新的查詢實例,您需要獲取該實例,並且您需要調用limit。

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

我剛收到這個問題。

參考

所以,在你的代碼中

錯誤的:

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}")
            }

        }

因為當您鏈接到查詢時,它會創建並返回一個在提供的文檔(獨占)之后開始的新查詢。 所以你必須重新分配它!

除了在單獨的引用中存儲查詢 object 之外,您還需要確保將非空lastDocument 傳遞給 startAfter。 您可以將其轉換為文檔快照或將 !! 在可變端

filterQuery.startAfter(lastDocument!!)
    .limit(3).get()

或者

filterQuery.startAfter(lastDocument as DocumentSnapshot)
    .limit(3).get()

它一定會起作用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM