#java #android #firebase #firebase-realtime-database
#java #Android #firebase #firebase-realtime-database
Вопрос:
Я хочу, чтобы DataSnapshot проверял, существует ли «месяц» в «сводке» его родителя. Но DataSnapshot возвращает, что в нем нет «месяца» в «сводке»
ds = FirebaseDatabase.getInstance().getReference("summary");
ds.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//summary
String key = ds.getKey();
if (dataSnapshot.hasChild("month")) {
Toast.makeText(newTransaction.this, "got value", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(newTransaction.this, "No value", Toast.LENGTH_LONG).show();
}
}
Моя база данных Firebase: я хочу проверить значение (синяя строка) у его родителя (красная строка)
Ответ №1:
Следующая строка кода:
String key = ds.getKey();
В данном случае возвращает ключ узла, на который указывает ссылка summary
. Между summary
узлом и month
свойством в вашей структуре есть еще один уровень, который на самом деле является нажатой клавишей (-MJKC … xGZX). Чтобы проверить, существует ли это свойство, вам также необходимо использовать этот ключ в ссылке. Предполагая, что summary
узел является прямым узлом корня вашей базы данных Firebase, пожалуйста, используйте следующие строки кода:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference keyRef = rootRef.child("summary").child("-MJKC_JkVFpCdCGqxGZX");
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.hasChild("month")) {
Toast.makeText(newTransaction.this, "got value", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(newTransaction.this, "No value", Toast.LENGTH_LONG).show();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d("TAG", databaseError.getMessage()); //Don't ignore potential errors!
}
};
keyRef.addListenerForSingleValueEvent(valueEventListener);
Однако вы не сохранили этот ключ в переменной, тогда вам следует использовать запрос, как показано ниже:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference summaryRef = rootRef.child("summary");
Query queryByMonth = summaryRef.orderByChild("month")
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
Toast.makeText(newTransaction.this, "got value", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(newTransaction.this, "No value", Toast.LENGTH_LONG).show();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d("TAG", databaseError.getMessage()); //Don't ignore potential errors!
}
};
queryByMonth.addListenerForSingleValueEvent(valueEventListener);
Комментарии:
1. Привет, Николас! Вы пробовали мое решение выше? Работает ли это?
2. Ваши решения также работают. Но я попытался, вместо вызова запроса я решил напрямую orderByKey() отсортировать ключ и использовать DataSnapshot.exist() для проверки правильности ключа.
3. Приятно слышать, что это сработало. Да, это хорошая идея для использования
orderByKey()
.