Как сравнить значение с дочерним элементом базы данных Firebase в реальном времени?

#android #firebase #firebase-realtime-database

#Android #firebase #firebase-realtime-database

Вопрос:

Я бы сравнил значение с дочерним элементом моей базы данных Firebase в реальном времени, но я не знаю, как это сделать. Структура моей базы данных:

введите описание изображения здесь

Это код, который я написал:

 email = loadPreferences();
mAuth = FirebaseAuth.getInstance();

FirebaseDatabase database = FirebaseDatabase.getInstance();
        final DatabaseReference myRef = database.getReference().child("users");
        myRef.orderByChild("email").equalTo(email).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                if(snapshot.getValue() != null) {
                    //loop through the keys
                    for(DataSnapshot datasnap : snapshot.getChildren()) {

                        if(!email.equalsIgnoreCase("")) {
                            myRef.child("users").child("email").child("address").setValue(getAddress());
                        }
                    }
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
            }
        });
 

Я пробовал с помощью отладчика, но когда он достиг «orderByChild ()», он пропускает все и переходит к концу. Кто-нибудь может мне помочь? Заранее спасибо

Ответ №1:

Данные загружаются из Firebase асинхронно, потому что их необходимо загружать из облака. Вместо того, чтобы блокировать приложение для ваших пользователей, Firebase вместо этого загружает данные в фоновом режиме и позволяет вашему основному коду продолжаться, что и происходит, когда вы просматриваете код.

Вместо пошагового выполнения кода поместите точку останова в первой строке внутри onDataChange и позвольте коду выполняться. Затем, когда данные будут доступны, отладчик достигнет вашей точки останова, и вы сможете продолжить отладку.

Вы также должны реализовать onCancelled , поскольку теперь вы игнорируете возможные проблемы. Как минимум, этот метод должен быть:

 public void onCancelled(@NonNull DatabaseError databaseError) { 
  throw databaseError.toException(); 
}
 

Комментарии:

1. Большое вам спасибо, теперь я вижу, что отладчик не пропускает инструкции, и я добавил реализацию onCancelled, как вы предложили. Если в моей пользовательской модели нет атрибута, подобного address, лучше ли мне добавить его или я могу добавить напрямую, как я опубликовал?