SingleValueEventListener не получают значение после нажатия кнопки - PullRequest
0 голосов
/ 01 июня 2019

Мне нужно получить значение псевдонима из базы данных Firebase в реальном времени после нажатия кнопки. Так что я сделал singleValueListner() в методе кнопки onClick. Но это не работает.

Я попытался отладить его, но код не попал в singleValueEventListener()

Button getName = (Button)findViewById(R.id.getName);

getName.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        DatabaseReference db = FirebaseDatabase.getInstance().getReference().child("Member").child(user.getUid());
        db.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot data : dataSnapshot.getChildren()) {
                    TextView tv = (TextView)findViewById(R.id.tv);
                    tv.setText(data.child("nickname").getValue().toString());
                }
            }

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

            }
        });
    }
});

Структура базы данных JSON:

{
  "Member" : {
    "1Zuv6VZZ0kPluwc33f1QQQ7DZD93" /* UID */ : {
      "-LgIHwiAjfuh5pjK7wzl" : {
        "actualScore" : 0,
        "bestScore" : 0,
        "email" : "some@email.com",
        "nickname" : "Vitek",
        "season" : 0
      }
    }
  }
}

Структура базы данных: https://drive.google.com/file/d/15B4b6Rb_WAiS6fioI9gItyijrbDiVjzJ/view

Мне нужно получить прозвище, я думаю, что это написано хорошо, но нет. Итак, что не так?

Ответы [ 3 ]

0 голосов
/ 02 июня 2019

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

DatabaseReference db = FirebaseDatabase.getInstance().getReference("Member");

Теперь просто вызовите однозначное событие.

db.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot data : dataSnapshot.getChildren()) {
                    TextView tv = (TextView)findViewById(R.id.tv);
                    tv.setText(data.child("nickname").getValue().toString());
                }
            }

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

            }
        });

Это сделает ваше дело.попробуйте отладку кода с журналом шаг за шагом.

0 голосов
/ 02 июня 2019

Чтобы получить значение вашей nickname собственности, используйте следующие строки кода:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("Member").child(uid);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        String nickname = dataSnapshot.child("nickname").getValue(String.class);
        Log.d(TAG, nickname);
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
uidRef.addListenerForSingleValueEvent(valueEventListener);

Вывод в вашем logcat будет:

Vitek

Таким образом, нет необходимости перебирать объект DataSnapshot, чтобы получить значение вашего свойства nickname. Если вы не получили этот результат, проверьте logcat, чтобы узнать, не распечатано ли сообщение об ошибке.

0 голосов
/ 01 июня 2019

Вы ссылаетесь только на идентификатор пользователя, но есть также родительский ключ сведений о пользователе, на который нужно сослаться.

tv.setText(data.child("LgiH------").child("nickname").getValue().toString());

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

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