我需要用旅行数据填充
RecyclerView
。这意味着我需要从Firestore数据库中检索两个不同集合的数据。
:
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列表现在已经完成,我们现在可以设置适配器。