Судя по всему, вы пытаетесь проверить, есть ли у ребенка order/0
с определенными checkIn
и productName
ниже Requests
. В вашей текущей структуре данных вы можете сделать это с помощью:
Query userQuery = database.getInstance().getReference().child("Requests")
.orderByChild("order/0");
userQuery.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot snapshot: dataSnapshot.getChildren()) {
String type = snapshot.child("checkIn").getValue().toString();
String type2 = snapshot.child("productName").getValue().toString();
if(type.equals("Saturday, April 20, 2019") && type2.equals("The Mansion")) {
Toast.makeText(details.this, "Not Available", Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(details.this, "Available", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException()
}
});
Отличия от вашего кода:
- У меня есть цикл внутри
onDataChange
, так как запрос может иметь несколько результатов.
- Я жестко закодировал дату, чтобы исключить проблему, вызванную тем, как вы вводите данные в текстовом представлении.
- Я работаю с
onCancelled
, поскольку игнорировать ошибки - просто плохая идея.
Более эффективный способ сделать то же самое - заставить Firebase выполнить часть запроса, например так:
Query userQuery = database.getInstance().getReference().child("Requests")
.orderByChild("order/0/checkIn").equalTo("Saturday, April 20, 2019");
userQuery.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot snapshot: dataSnapshot.getChildren()) {
String type2 = snapshot.child("productName").getValue().toString();
if(type2.equals("The Mansion")) {
Toast.makeText(details.this, "Not Available", Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(details.this, "Available", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException()
}
});
Здесь изменение:
- Я переместил часть проверки в запрос, чтобы Firebase мог выполнить этот фильтр на сервере. Это означает, что он должен загружать меньше данных клиенту, делая его быстрее и дешевле.
- Вам все равно придется фильтровать второе значение на стороне клиента, поскольку запросы Firebase могут упорядочивать / фильтровать только по одному свойству. Подробнее об этом см. Запрос на основе нескольких предложений where в Firebase .
Обратите внимание, что вы запрашиваете двойные вложенные данные. Хотя вы можете заставить это работать для определенного заказа (orders/0
в этом примере), если у вас может быть несколько заказов в запросе, Firebase не сможет выполнять запросы по всем из них.
Подробнее об этом и решении см .: Firebase Query Double Nested
Я бы также порекомендовал прочитать мои ответы о категориях моделирования, потому что у меня есть ощущение, что вам это понадобится в ближайшее время: Запрос Firebase, если child of child содержит значение