Проблема с получением значения счетчика из базы данных Firebase в реальном времени

#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());
        }
    });