同步两个事件听众 /使用Firestore的嵌套查询

问题描述 投票:0回答:1

我需要用旅行数据填充

RecyclerView
。这意味着我需要从Firestore数据库中检索两个不同集合的数据。

    收集1:“用户”,其中包含每个用户的所有数据
  1. 收集2:“旅行”,其中包含每次旅行的所有数据
  2. 在每次旅行中,都存储了驱动程序,使用该驱动程序ID我想检索有关该用户的更多信息,因此我需要两个查询。
  3. 这意味着我需要一个听众内部的听众,这有两个问题。
要详细解释这一点,这是我的non-working

public class Trip { private String attribute1, attribute2, etc. private User driver; ... constructor, getters, setters } public class User { private String id, username, email, etch. ... constructor, getters, setters // Fragment class private void retrieveTrips(){ database.collection("trips") .get() .addOnCompleteListener(task -> { if(task.isSuccessful() && task.getResult() != null) { Trips<Trip> = new ArrayList<>(); for(QueryDocumentSnapshot queryDocumentSnapshot : task.getResult()){ Trip trip = new Trip(); trip.setTripUid(queryDocumentSnapshot.getId()); trip.setStartTime(queryDocumentSnapshot.getString("startTime")); trip.setStartLocation(queryDocumentSnapshot.getString("startLocation")); // etc. String driverId = queryDocumentSnapshot.getString("driverId"); // Now I need to retrieveUser driver data using driverId Query driverQuery = database.collection("users").whereEqualTo("userId" , driverId); driverQuery.get().addOnCompleteListener( task2 -> { if (task2.isSuccessful() && !task2.getResult().isEmpty()) { for (QueryDocumentSnapshot document : task2.getResult()) { String driverUsername = document.getString("username"); String driverEmail = document.getString("email"); // etc.. many attributes trip.setDriver(new User(driverUid,driverUsername,driverEmail, etc...)); } } else if(task2.getResult().isEmpty()) { //Driver not found in Firestore } else { // task2 not successful }}).addOnFailureListener(e -> // error)); } if(!trips.isEmpty()){ // if trips list is not empty, set the adapter TripAdapter tripAdapter = new TripAdapter(trips,this); binding.availableTripsRecyclerView.setAdapter(tripAdapter); } else{ // found no trips to show showErrorMessage(); } } else{ // error !task.isSuccessful() or task.getResult() == null } });

问题1)必须将旅行和旅行列表声明为最终列表,并将其放置在听众之外,作为类属性。 问题2)。听众彼此之间的同步。 “外部”听众在“嵌套”之前执行并完成完成。 使用最终阵列方法解决问题1)看起来很糟糕。 实现这些嵌套查询的正确方法是什么? 执行顺序示例:

Eoutside侦听器被称为:

为每个文档效果启动loop 第一次旅行的属性存储在旅行对象中。 外部听众的执行被停止,嵌套的侦听器被称为..

用户驱动程序的详细信息被检索并存储在同一行程对象中。 trip对象已完成,现在可以在旅行列表中添加 themented的听众是完整的,并且继续执行外部听众。

代码对检索的所有文档执行相同的执行。 trips列表现在已经完成,我们现在可以设置适配器。

  1. 这意味着我需要一个听众内的听众。
  2. 我在您的代码中看到的内容,您正在使用
  3. Query#get()
  4. 调用而不是compersistent的侦听器
  5. ,这意味着您每次都会完全读取数据。
  6. 由于您正在处理NOSQL数据库,请注意,这里没有加入条款。因此,拥有两个不同集合的结构以查询它们,这两者都不是您的情况下的最佳选择。
  7. 我建议的是在单个集合的文档中添加所需的所有数据,因此您可以一次查询数据。例如,您可以考虑添加与用户文档本身中用户相对应的旅行。这意味着,如果您需要使所有用户及其所有数据和旅行,则需要一个查询。但是,只要用户文档中的数据停留在
  8. 1MIB最大限制
  9. 另一方面,您还可以考虑查看
  10. FireBase实时数据库
,该数据库具有不同的构造数据和完全不同的计费机制的方式。
java android firebase google-cloud-platform google-cloud-firestore
1个回答
0
投票
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.