equalTo datasnapshot из базы данных Firebase Realtime, возвращающей нулевое значение - PullRequest
0 голосов
/ 21 февраля 2019

Когда пользователь запускает действие, должен появиться Toast, содержащий родительский узел, где значение "drinkManufacturerID" равно заданной строке.Однако в тосте возвращается нулевое значение.

Соответствующий код:

public class DealRawDataActivity extends AppCompatActivity {

DatabaseReference databaseDrinks;

String keys;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_deal_raw_data);

    databaseDrinks = FirebaseDatabase.getInstance().getReference("drinks").child("-LWLuM2nesg0uaP0dLSn");

    databaseDrinks.orderByChild("drinkManufacturerID").equalTo("D1eY5v9guwSIWMvfLoq8xGywrT53").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot datas : dataSnapshot.getChildren()) {
                keys = datas.getKey();
            }
        }
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

   Toast.makeText(this, keys, Toast.LENGTH_LONG).show();
}

}

Структура базы данных Firebase Realtime: enter image description here

1 Ответ

0 голосов
/ 21 февраля 2019

При попытке отобразить сообщение Toast со значением вашей переменной keys вне обратного вызова, вы всегда получите null, поскольку onDataChange() работает асинхронно.Поскольку этот метод возвращает немедленно, значение вашей переменной keys, которую вы пытаетесь отобразить, еще не было заполнено из обратного вызова.Там нет никаких гарантий о том, сколько времени это займет.Таким образом, это может занять от нескольких сотен миллисекунд до нескольких секунд, прежде чем эти данные станут доступны.

Для быстрого решения этой проблемы можно было бы использовать переместить следующую строку кода:

Toast.makeText(this, keys, Toast.LENGTH_LONG).show();

Сразу после окончания цикла for, в противном случае я рекомендую вам увидеть последнюю часть моего ответа из этого поста , в котором я объяснил, как это можно сделать с помощью пользовательского обратного вызова.Вы также можете взглянуть на это видео для лучшего понимания.

Редактировать: Пожалуйста, смотрите ниже весь код:

public class DealRawDataActivity extends AppCompatActivity {
    DatabaseReference databaseDrinks;
    String keys;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_deal_raw_data);
        databaseDrinks = FirebaseDatabase.getInstance().getReference("drinks").child("-LWLuM2nesg0uaP0dLSn");
        databaseDrinks.orderByChild("drinkManufacturerID").equalTo("D1eY5v9guwSIWMvfLoq8xGywrT53").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot datas : dataSnapshot.getChildren()) {
                    keys = datas.getKey();
                }
                Toast.makeText(this, keys, Toast.LENGTH_LONG).show(); //Should work!!
            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }
}
...