#java #android #firebase #firebase-realtime-database
#java #Android #firebase #firebase-realtime-database
Вопрос:
Я пытаюсь получить значение счетчика и установить его в свой идентификатор модели, используя базу данных Firebase.
Подключение к базе данных работает, и другие методы тоже. Теперь я пытаюсь не вручную устанавливать идентификатор для моей модели каждый раз, когда мне нужно добавить новый элемент.
Проблема в том, что ValueEventListener, который должен извлекать идентификатор, не работает, что означает, что приложение не «вводит» этот фрагмент кода.
invia.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
final Data data = new Data();
FirebaseDatabase database2 = FirebaseDatabase.getInstance();
DatabaseReference myRef2 = database2.getReference("Counter/node");
myRef2.addValueEventListener(new ValueEventListener() {
@Override public void onDataChange(DataSnapshot dataSnapshot) {
Counter counter = dataSnapshot.getValue(Counter.class);
data.setId(String.valueOf(counter.getCnt_android() 1));
}
@Override public void onCancelled(DatabaseError databaseError) {
System.out.println("The read failed: " databaseError.getCode());
}
});
data.setUser(user.getText().toString());
data.setPassword(password.getText().toString());
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference("Information Android/");
myRef.child(data.getId()).setValue(data);
Counter cnt_android = new Counter();
cnt_android.setCnt_android(Integer.parseInt(data.getId()));
myRef2.child("cnt_android").setValue(cnt_android);
}
});
Я попытался поместить эти две строки:
data.setUser(user.getText().toString());
data.setPassword(password.getText().toString());
Внутри onDataChange, чтобы увидеть, является ли проблемой получение значения счетчика, но это не потому, что они остаются нулевыми, даже если я даю их из полей редактирования внутри приложения, поэтому я начинаю думать, что проблема в этом конкретном коде.
Приложение завершает работу в этой строке:
myRef.child(data.getId()).setValue(data);
потому что для идентификатора нет значения.
Ответ №1:
Firebase onDataChange()
является асинхронной, что означает, что компилятор перейдет к следующей задаче, а затем, когда onDataChange()
получит все данные, она будет выполнена.
В вашем случае, после onDataChange()
, у вас есть следующий код:
myRef.child(data.getId()).setValue(data);
Это выполняется раньше, onDataChange()
следовательно data.getId()
, возвращает значение null.
Чтобы решить вашу проблему, вам нужно добавить свой код внутрь onDataChange()
:
myRef2.addValueEventListener(new ValueEventListener() {
@Override public void onDataChange(DataSnapshot dataSnapshot) {
Counter counter = dataSnapshot.getValue(Counter.class);
data.setId(String.valueOf(counter.getCnt_android() 1));
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference("Information Android/");
myRef.child(data.getId()).setValue(data);
}
@Override public void onCancelled(DatabaseError databaseError) {
System.out.println("The read failed: " databaseError.getCode());
}
});