簡體   English   中英

使用 orderBy whereEqual 和 startAfter 查詢 firestore

[英]Querying firestore with orderBy whereEqual and startAfter

我想在我的項目中制作一個帶有分頁的recyclerView 但是,我被困在了這個過程中。

我的 Firestore 數據構建如下(某些文檔具有 visibility=false 作為值,因此我不希望它們出現):

在此處輸入圖像描述

現在,我想獲取按dateCreated排序的前 5 個文檔,然后按我之前收到的最后一個值繼續分頁。

我嘗試使用以下內容:

db
    .collection( "Quotes" )
    .whereEqualTo( "visibility", true )
    .orderBy("dateCreated", Query.Direction.DESCENDING )
    .startAfter("dateCreated", dateCreatedOrig
    .get(dateCreatedOrig.size()-1))
    .limit(5)
    .get()
        .addOnCompleteListener( task -> {
            if (task.isSuccessful()) {
                for (QueryDocumentSnapshot document : task.getResult()) {
                        ...
                    }

                }

                dAdapter = new Ddapter(...);
                ddapter.notifyDataSetChanged();
                rv_Quotes.setAdapter( ddapter );

            }
        } );

其中dateCreatedOrig是 List ,其中包含第一個查詢的時間戳,所以我得到最后一個時間戳以從那里繼續分頁。

但是,我收到以下錯誤:

java.lang.IllegalArgumentException:提供給 startAfter() 的 arguments 太多。 arguments 的數量必須小於或等於 orderBy() 子句的數量。

有任何想法嗎?

這里的問題是您將 2 arguments 傳遞給startAfter 如果您看到startAfter文檔,您將看到它:

創建並返回一個新的查詢,該查詢在提供的字段之后相對於查詢的順序開始。 字段值的順序必須與查詢的 order by 子句的順序相匹配

這意味着您定義將在orderBy子句中使用的字段名稱,而不是startAfter ,並且兩者應該一起使用。 所以在你的情況下,所有需要做的就是刪除startAt的第一個參數,它會起作用,所以它看起來像這樣:

db.collection( "Quotes" )
  .whereEqualTo( "visibility", true )
  .orderBy("dateCreated", Query.Direction.DESCENDING )
  .startAfter(dateCreatedOrig.get(dateCreatedOrig.size()-1))
  .limit(5)
  .get()
  .addOnCompleteListener(...);

暫無
暫無

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

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