DataSnapshot не удалось получить значение родительского push-ключа

#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: я хочу проверить значение (синяя строка) у его родителя (красная строка)

Моя база данных 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() .