Мне нужно заполнить переработку с помощью данных поездки. Это означает, что мне нужно извлечь данные из двух разных коллекций из моей базы данных Firestore. >
Коллекция 2: «Трипсы», которые содержат все данные для каждой поездки < /li>
< /ol>
Внутри каждую поездку хранится DriverId, используя, используя That DriverId, который я хочу получить больше информации об этом пользователе, поэтому мне понадобятся два запроса. p>
Чтобы объяснить это подробно, вот мой неработающий < /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>
Проблема 1) Список поездки и поездок должны быть объявлены как окончательные списки и размещены вне слушателей, как атрибуты класса.
Задача 2). Слушатели бегут асинхронно друг к другу. «Внешний» слушатель выполняет и заканчивает перед «вложенным», который даже начинается. Способ реализации этих вложенных запросов? Br /> Запуск цикла для каждого результата документа < /li>
Атрибуты первой поездки хранятся в объекте поездки. и вложенный слушатель называется .. < /li>
Подробная информация о драйвере пользователя получена и хранятся в том же объекте поездки. < /li>
Объект поездки завершен и теперь может быть Добавлено внутри списка поездок < /li>
Вложенного прослушивателя завершено, и выполнение внешнего слушателя продолжается .. < /li>
Код выполняет то же самое для всех полученных документов.
Подробнее здесь: https://stackoverflow.com/questions/793 ... -firestore
Синхронизировать двух слушателей событий / Использование вложенных запросов для Firestore ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Синхронизировать двух слушателей событий / Использование вложенных запросов для Firestore
Anonymous » » в форуме JAVA - 0 Ответы
- 10 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Синхронизировать двух слушателей событий / Использование вложенных запросов для Firestore
Anonymous » » в форуме Android - 0 Ответы
- 15 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Синхронизировать двух слушателей событий / Использование вложенных запросов для Firestore
Anonymous » » в форуме Android - 0 Ответы
- 12 Просмотры
-
Последнее сообщение Anonymous
-