[*] и сбор 2: «поездки», которые содержат все данные для каждой поездки < /li>
< /ol>
Внутри каждую поездку хранится DriverId, хранится, Используя эту DriverID, я хочу получить больше информации об этом пользователе, поэтому мне понадобятся два запроса.
Чтобы объяснить это подробно, вот некоторые неработающий < /strong> код в качестве примера: < /p>
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 = 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
}
});
< /code>
Первая проблема, с которой я столкнулся, заключается в том, что поездки по поездке и списку должны быть объявлены как окончательные списки и размещены вне слушателей, чтобы быть доступными. Я заставил это работать, но затем наступает вторая проблема. Слушатели бегут асинхронно друг к другу. Внешний слушатель выполняет и заканчивает до того, как вложенный один запускается. Мне нужен кто -то, кто объяснил мне, каков правильный способ реализации чего -то подобного .. < /p>
Пример: < /p>
- Внешнее слушатель называется: < /li>
Запуск цикла для каждого результата документа < /li>
Атрибуты первой поездки хранятся в объекте Trip. < /Li>
Выполнение внешнего прослушивателя остановлено, а вложенный прослушиватель называется .. < /li>
Подробная информация о драйвере пользователя получена и хранятся в одном и том же объекте поездки. < /li>
< LI> Объект Trip завершен и теперь может быть добавлен в список поездок < /li>
Вложенный слушатель завершен, а выполнение внешнего слушателя продолжается .. < /li>
Код выполняет то же самое для всех полученных документов. - Список поездок теперь завершен, и теперь мы можем установить адаптер.
Подробнее здесь: https://stackoverflow.com/questions/793 ... restore-an