簡體   English   中英

Android Firestore 子集合到 RecyclerView

[英]Android Firestore subcollections into RecyclerView

我目前正在 Java Android Studio 中開發租車應用程序。 對於項目數據庫,我使用的是 Cloud Firestore。 我的數據庫結構如下:

收藏

子集合: 子集合

第一個圖像由多個具有隨機 ID 的文檔(每個代表一輛車)的 Cars 集合表示。 每輛車都有一個名為 bookings 的唯一子集合,其中保存在隨機 ID 文檔中有關對該特定汽車進行的預訂的詳細信息(第二張圖像由一個預訂子集合的示例表示)。

我目前在“預訂歷史”部分工作。 在那里,我想將當前用戶的預訂歷史記錄(在第二張圖像中以紅色突出顯示)放在 RecyclerView 中。 我知道如何在所有汽車及其子集合之間進行迭代,並設置 if(bookedBy == currentUser) 條件以僅獲取當前用戶預訂的汽車。

但我的問題是:如何將它們保存在 RecyclerView 中? 如果滿足我們之前的條件,我想在 RecyclerView 中保存以紅色突出顯示的數據(第二張圖像)。 我不知道在 Firestore 適配器中放入什么查詢。 我正在考慮將用戶預訂的所有汽車及其日期保存在 object 或類似的東西中,但我無法弄清楚。 任何人都可以幫助我嗎?

謝謝!

根據您的數據庫結構,如下所示:

Firestore-root
  |
  --- Cars (collection)
       |
       --- $cardId (document)
             |
             --- bookings (collection)
                  |
                  --- $bookingId
                        |
                        --- bookedBy: "bogdanmaris11@yahoo.com"
                        |
                        --- endDate: 31 May, 2021...
                        |
                        --- finalPrice: 1998
                        |
                        --- startDate: 30 May, 2021...

要獲取與特定用戶對應的所有預訂,需要Cloud Firestore 集合組查詢 此查詢如下所示:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
Query queryByEmail = rootRef.collectionGroup("bookings").whereEqualTo("bookedBy", "bogdanmaris11@yahoo.com");
queryByEmail.get().addOnCompleteListener(/* ... /*);

有三件事需要注意。 要從此查詢中獲得所需的結果,您可以檢查 email 地址,因為您可能有錯字 bogdanmari(u)s11@yahoo.com,其中缺少“u”。 其次,最好根據用戶的 UID 而不是 email 地址過濾用戶,因為用戶可以隨時更改 email 地址,而 UID 將始終保持不變。 第三個,據我了解,您打算使用Firebase-UI 庫,這很好。 在這種情況下,應將“queryByEmail”傳遞給 FirestoreRecyclerOptions.Builder 的setQuery()方法。 但是,可能會有一個問題,因為每個查詢都需要一個index ,並且Firestore 中的索引數量是有限的

根據你寫的:

我正在考慮將用戶預訂的所有汽車及其日期保存在 object 或類似的東西中,但我無法弄清楚。

好主意啊。 這與 object 無關,它更多的是關於子集合或新的頂級集合,您可以在其中嵌套與特定用戶對應的所有預訂。 在第一種情況下,您的架構將如下所示:

Firestore-root
  |
  --- bookings (collection)
       |
       --- $uid (document) //Not email address
             |
             --- userBookings (collection)
                  |
                  --- $bookingId
                        |
                        --- carId: "YI1J ... VSm0"
                        |
                        --- endDate: 31 May, 2021...
                        |
                        --- finalPrice: 1998
                        |
                        --- startDate: 30 May, 2021...

如果在Booking object 中不需要任何 email 地址,但如果您需要汽車數據,則需要“cardId”。 要獲得單個用戶的所有預訂,需要以下參考:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference userBookingsRef = rootRef.collection("bookings").document(uid).collection("userBookings");
userBookingsRef.get().addOnCompleteListener(/* ... /*);

在第二個:

Firestore-root
  |
  --- allBookings (collection)
        |
        --- $bookingId
               |
               --- bookedBy: "longUid"
               |
               --- carId: "YI1J ... VSm0"
               |
               --- endDate: 31 May, 2021...
               |
               --- finalPrice: 1998
               |
               --- startDate: 30 May, 2021...

一個簡單的查詢(沒有索引)在哪里可以解決問題:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
Query QueryByUid = rootRef.collection("allBookings").whereEqualTo("uid", uid);
QueryByUid.get().addOnCompleteListener(/* ... /*);

將第一個引用或此查詢傳遞給您的“FirestoreRecyclerAdapter”,僅此而已。

暫無
暫無

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

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