在我的 Android 測驗應用程式中,我使用 Firebase Firestore 和 Pagination v3 Android Jetpack 庫實作了排行榜,每個頁面包含 2 個元素以降低閱讀成本。我通過一個名為“score”的欄位的降序值來查詢檔案。它適用于處于排行榜頂部的人。但是,例如,當用戶是第 1000 個時,如果沒有查詢 1000 個檔案,我就無法顯示它,因此它將花費 1000 次讀取。那么有沒有一種方法可以在不查詢所有檔案的情況下獲得用戶排名?
編輯:
@HiltViewModel
class LeaderboardScreenViewModel @Inject constructor(
) : ViewModel() {
private val db = Firebase.firestore
val loadingState = MutableStateFlow(LoadingState.IDLE)
val flow = Pager(PagingConfig(pageSize = 2)) {
FirestorePagingSource(
queryBestScores = db.collection("users_public_details").orderBy("score", Query.Direction.DESCENDING)
.limit(6L)
)
}.flow
.cachedIn(viewModelScope)
}
class FirestorePagingSource(
private val queryBestScores: Query
) : PagingSource<QuerySnapshot, DocumentSnapshot>() {
override fun getRefreshKey(state: PagingState<QuerySnapshot, DocumentSnapshot>): QuerySnapshot? =
null
override suspend fun load(params: LoadParams<QuerySnapshot>): LoadResult<QuerySnapshot, DocumentSnapshot> {
return try {
val currentPage = params.key ?: queryBestScores.get().await()
val lastVisibleScore = currentPage.documents[currentPage.size() - 1]
val nextPage = queryBestScores.startAfter(lastVisibleScore).get().await()
LoadResult.Page(
data = currentPage.documents,
prevKey = null,
nextKey = nextPage
)
} catch (e: Exception) {
LoadResult.Error(e)
}
}
}
uj5u.com熱心網友回復:
有沒有辦法通過欄位值過濾檔案并獲得第 1000 個而不查詢之前的 999 個檔案?
這實際上是不可能的。對于 Firestore,您只能使用Query#limit(long limit)方法請求特定大小的資料頁。話雖如此,您可以從查詢的開頭開始,并逐頁獲取相同大小的以下頁面。此操作應繼續執行其他類似操作,直到您到達包含第 1000 個檔案的頁面。
您無法直接跳轉到該檔案。您總是必須閱讀所有前面的頁面。因此,您必須從第一頁開始,然后使用查詢游標向前瀏覽頁面,方法是指定哪個檔案是上一個查詢中的最后一個檔案。
除此之外,由于 Firestore 中的集合不維護檔案計數,因此除非您創建和維護自己的檔案計數,否則您將無法提前知道有多少頁資料。
如果你想實作一種處理分頁的現代方式,你應該考慮實作所謂的“無限滾動”。Facebook 就是這樣做的,Instagram 就是這樣做的。那里有很多例子。
我還寫了一篇文章,叫做:
- 如何計算 Firestore 集合中的檔案數量?
我已經解釋了如何計算 Firestore 集合中的檔案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/484110.html
