Как вытащить данные из Firebase в Android Studio в точном месте кода? - PullRequest
0 голосов
/ 10 апреля 2019

Есть ли способ извлечь данные из базы данных, где находится код? В настоящее время у меня есть valueEventListeners, но все они запускаются после кода ниже, что делает недействительным следующий код. Я хочу иметь возможность получить значение именно там, где находится код, а не позже.

На данный момент я не нашел в Интернете ничего об этом.

Хороший пример моих проблем в коде:

public void onItemClick(AdapterView<?> l, View v, final int position, long id) {

        FirebaseAuth mAuth = FirebaseAuth.getInstance();
        FirebaseUser user = mAuth.getCurrentUser();
        final String uid = user.getUid();

        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                cCESnapshot = dataSnapshot.child(uid).child("currChallenges").child(challengeList.get(position));
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

        Intent intent = new Intent();
        intent.setClass(this, ChallengeView.class);
        intent.putExtra("snapshot", cCESnapshot.toString());
        intent.putExtra("name", challengeList.get(position));
        startActivity(intent);
    }

cCESnapshot имеет значение null, поскольку намерение выполняется до значения valueEventListener.

Ответы [ 2 ]

2 голосов
/ 10 апреля 2019

Это асинхронная операция, когда данные поступят, будет вызван обратный вызов onDataChange. Ваш код startActivty будет выполняться последовательно, и поэтому вы не получите значения в cCESnapshot.

Переместите код startActivity внутрь слушателя.

Но будьте осторожны , потому что каждый раз, когда будет вызываться прослушиватель щелчков onItemClick, вы добавляете прослушиватель события value. Таким образом, вы будете иметь несколько вызовов на onDataChange за каждый клик и, таким образом, несколько startActivities.

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

2 голосов
/ 10 апреля 2019

onDataChange() является асинхронным, поэтому единственный способ использовать извлеченные данные - внутри onDataChange(), пример:

databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            cCESnapshot = dataSnapshot.child(uid).child("currChallenges").child(challengeList.get(position));

    Intent intent = new Intent();
    intent.setClass(this, ChallengeView.class);
    intent.putExtra("snapshot", cCESnapshot.toString());
    intent.putExtra("name", challengeList.get(position));
    startActivity(intent);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...