Синхронизировать двух слушателей событий в Java / Использование вложенных запросов для Firestore, Android JavaJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Синхронизировать двух слушателей событий в Java / Использование вложенных запросов для Firestore, Android Java

Сообщение Anonymous »

Мне нужно заполнить переработку с помощью данных о поездке. Это означает, что мне нужно извлечь данные из двух разных коллекций из моей базы данных Firestore. >
[*] и сбор 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»