当前位置: 首页 > 知识库问答 >
问题:

Android的FiRecovery子集合到RecyclerView

葛雨华
2023-03-14

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

第一张图像由多个随机ID文档(每个文档代表一辆车)组成的汽车集合表示。每辆车都有一个唯一的子集合,名为bookings,它保存在随机ID文档中,详细介绍了对该特定车进行的预订(第二个图像由一个booking子集合的示例表示)。

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

但我的问题是:我怎样才能把它们保存在回收视图中?如果满足之前的条件,我想在RecyclerView中保存以红色突出显示的数据(第二幅图像)。我不知道在Firestore适配器中放入什么查询。我想把用户预订的所有汽车和它们的日期保存在一个对象或类似的东西中,但我想不出来。谁能帮帮我吗?

非常感谢。

共有1个答案

云正信
2023-03-14

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

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(/* ... /*);

有三件事需要注意。要从这个查询中获得所需的结果,您可以检查电子邮件地址,因为您可能有一个拼写错误bogdanmari(u)s11@yahoo.com,这里缺少“u”。其次,最好根据用户的UID而不是电子邮件地址来过滤用户,因为用户可以随时更改电子邮件地址,而UID将始终保持不变。第三个,据我所知,您打算使用Firebase UI库,这很好。在这种情况下,“QueryByMail”应该传递给FirestoreRecyclerOptions。生成器的setQuery()方法。然而,这可能会有一个问题,因为每个查询都需要一个索引,而且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”,就差不多了。

 类似资料:
  • 我被android firstore文档和子集合弄糊涂了。 此示例将生成以下数据结构: 代码如下: 子集合和文档节点交替显示:a、c与b、d。 但是如何在没有d节点的情况下实现类似的数据结构(如下所示): 自。add方法仅适用于document而不适用于collection,我们不能只删除d(document),因为c(collection)没有add方法。 我应该如何修改我的代码?

  • 我们在Google Firestore中有一个收藏。 我们是否可以在一条语句中添加一个包含数据的文档和此新文档下的子集合?

  • 我的云Firestore数据库中有以下规则: 这个想法是,如果你拥有一个性能,你可以读写它;如果你登录,你可以创建一个性能。 此查询工作正常: 但是,如果我想获取'场景'子集合的内容,我会收到一个错误:"com.google.firebase.firestore.FirebaseFirestoreException:PERMISSION_DENIED:缺少或权限不足。"这是与以下查询: 我假设我需

  • 我正在Firestore中制作一个“聊天演示”来保存信息,我是这样做的: 但问题是,文档显示它不存在,尽管它包含一个子集合。 正如上面写的:“这个文档不存在”,尽管它包含一个名为的子集合,其中包含更多文档。 但是我需要检查带有特定名称的文档是否存在于集合下。 我的代码是否有任何问题,或者我是否需要以其他方式进行? 提前谢谢。

  • 我是《颤栗》和《火种》的新手。 我有一个名为“菜肴”的集合,其中我有许多文档(例如名称、描述等),我还有一个名为成分的子集合,其中我有作为文档的id、名称和数量。 我要做的是取回所有含有配料的菜肴。 我有一个模型 IngredientModel模型 DishHelper 餐具供应商 主要我写了 和在家中(在构建方法中) 但是如果我尝试打印<code>打印(dishProvider.disks)我获

  • 我正在尝试将以下结构从实时数据库迁移到Firestore: 因此,在根节点“资源”下,我有一些包含资源项列表的子节点(SENT、ACCEPT、REFUSED、...)。 使用Firestore,我似乎无法将subCollection直接置于collection之下(当我试图在管理控制台中使用Firestore复制此结构时,我需要创建一个中间文档,如: 女巫通向那个结构: 因此子节点“SENT”被复