【问题标题】:Android Firestore subcollections into RecyclerViewAndroid Firestore 子集合到 RecyclerView
【发布时间】:2021-05-14 07:58:45
【问题描述】:

我目前正在 Java Android Studio 中开发一个租车应用程序。对于项目数据库,我使用的是 Cloud Firestore。我的数据库结构如下:

子集合:

第一个图像由多个具有随机 ID 的文档的 Cars 集合表示(每个文档代表一辆车)。每辆车都有一个名为 bookings 的唯一子集合,其中保存在随机 ID 文档中有关对该特定汽车进行的预订的详细信息(第二张图像由一个预订子集合的示例表示)。

我目前在“预订历史”部分工作。在那里,我想将当前用户的预订历史记录(在第二张图像中以红色突出显示)放在 RecyclerView 中。我知道如何在所有汽车及其子集合之间进行迭代,并设置 if(bookedBy == currentUser) 条件以仅获取当前用户预订的汽车。

但我的问题是:如何将它们保存在 RecyclerView 中?如果满足我们之前的条件,我想在 RecyclerView 中保存以红色突出显示的数据(第二张图像)。我不知道在 Firestore 适配器中放入什么查询。我正在考虑将用户预订的所有汽车及其日期保存在一个对象或类似的东西中,但我无法弄清楚。有人可以帮帮我吗?

谢谢!

【问题讨论】:

  • 请编辑您的问题并添加它的屏幕截图,而不是描述您的数据库的外观。除此之外,还请突出显示您想要获取的确切数据。
  • 完成,添加图片和更多说明
  • 我知道如何在所有汽车及其子集合之间进行迭代,并放入 if(bookedBy == currentUser) 条件以仅获取当前用户预订的汽车。你是怎么做到的?因此,如果您实现了这一点,我认为这是解决您的问题的关键,那么您正在寻找什么确切的查询?
  • 我不知道如何将所有结果保存在 RecyclerView 中,因为据我所知,您只能将查询传递给 FirestoreRecyclerAdapter。例如,如果用户租了 3 辆汽车,我该如何实现?
  • 我想我明白了。我马上给你写一个答复。

标签: java android firebase google-cloud-firestore android-recyclerview


【解决方案1】:

根据您的数据库结构,如下所示:

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 collection group query。此查询如下所示:

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

需要注意三件事。要从此查询中获得所需的结果,您可以检查电子邮件地址,因为您可能有错字 bogdanmari(u)s11@yahoo.com,其中缺少“u”。其次,最好根据用户的 UID 而不是电子邮件地址过滤用户,因为用户可以随时更改电子邮件地址,而 UID 将始终保持不变。第三个,据我了解,您打算使用Firebase-UI library,这很好。在这种情况下,应将“queryByEmail”传递给 FirestoreRecyclerOptions.Builder 的 setQuery() 方法。但是,可能会出现问题,因为每个查询都需要 indexnumbers of indexes are limited in Firestore

根据你写的:

我正在考虑将用户预订的所有汽车及其日期保存在一个对象或类似的东西中,但我想不通。

这是个好主意。这与对象无关,更多的是关于子集合或新的顶级集合,您可以在其中嵌套与特定用户对应的所有预订。在第一种情况下,您的架构将如下所示:

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 对象中不需要任何电子邮件地址,但如果您需要汽车数据,则需要“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”,仅此而已。

【讨论】:

  • 非常有用的信息。非常感谢您,因为它帮助我解决了问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-25
相关资源
最近更新 更多