Проблема получения значения счетчика из базы данных Firebase в реальном времени - PullRequest
1 голос
/ 30 марта 2019

Я пытаюсь получить значение счетчика и устанавливаю его в качестве идентификатора модели, используя базу данных 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, чтобы увидеть, если это проблема с получением значения счетчика, но не потому, что они остаются нулевыми, даже если я даю их из EditBoxes внутри приложения, поэтому яЯ начинаю думать, что есть проблема с этим конкретным кодом.

В этой строке происходит сбой приложения:

myRef.child(data.getId()).setValue(data);

, поскольку для идентификатора нет значения.

1 Ответ

1 голос
/ 30 марта 2019

Firebase onDataChange() является асинхронным, что означает, что компилятор перейдет к следующей задаче, а затем, когда onDataChange() получит все данные, он будет выполнен.

В вашем случае после onDataChange() у вас есть следующий код:

 myRef.child(data.getId()).setValue(data);

Это выполняется до onDataChange(), поэтому data.getId() возвращает ноль.

Чтобы решить вашу проблему, вам нужно добавить свой код внутрь 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());
        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...