Отображение данных имени пользователя из firebase - PullRequest
1 голос
/ 24 сентября 2019

Я хочу отобразить «имя пользователя» из моей базы данных Firebase в textView, но вместо этого я получаю нулевое значение.Я предоставляю изображение из myfirebase

enter image description here

private fun showUsername() {
    val ref = FirebaseDatabase.getInstance().getReference("/users")
    ref.addValueEventListener(object : ValueEventListener{
        override fun onCancelled(p0: DatabaseError) {

        }

        override fun onDataChange(p0: DataSnapshot) {
            val userName = p0.child("username").getValue().toString()
            txtUserTampil.text = userName
        }

    })
}

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

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

Я предполагаю, что вы вставляете пользователей следующим образом:

fun insertUser(user: User) {
    val ref = FirebaseDatabase.getInstance().getReference("/users") 
    ref.push().setValue(user)
}

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

fun insertUser(user: User): String {
    val ref = FirebaseDatabase.getInstance().getReference("/users") 
    val child = ref.push()
    child.setValue(user)
    return child.key
}

Теперь немного измените ваш showUsername(), чтобы он принимал userKey в качестве параметра, который будет принимать точную ссылку пользователя,

private fun showUsername(userKey: String) {
    val ref = FirebaseDatabase.getInstance().getReference("/users")
    // Add listener to the specific user instead of whole users reference
    ref.child(userKey).addValueEventListener(object : ValueEventListener{
        override fun onCancelled(p0: DatabaseError) {

        }

        override fun onDataChange(p0: DataSnapshot) {
            val userName = p0.child("username").getValue().toString()
            txtUserTampil.text = userName
        }

    })
}

Теперь вызовите вышеуказанные функции следующим способом для сохраненияключ и / или передать его в функцию showUsername(),

val user = User(...)
val userKey = insertUser(user) // store it
showUsername(userKey)

Альтернатива

Если вы уже храните uid и не хотите хранить userKeyтогда я бы посоветовал вам не указывать uid в свойстве пользователя и использовать его в качестве ключа пользователя,

val uid = ...
val name = ...
val email = ...
val user = User(name, email)
//Insert
val ref = FirebaseDatabase.getInstance().getReference("/users")
ref.child(uid).setValue(user)
// Display
showUsername(uid)
1 голос
/ 24 сентября 2019

В FireBase вы не можете получить ссылку на ребенка, сначала вам нужно сослаться на его дочернего элемента, а затем, после того, как вы можете назвать его дочернего элемента, попробуйте это:

ref.child("you parent key").child("username").addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot snapshot) {
        try {
            if (snapshot.getValue() != null) {
                try {
                    Log.e("TAG", "" + snapshot.getValue()); // your name values you will get here
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else {
                Log.e("TAG", " it's null.");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onCancelled(FirebaseError firebaseError) {
        Log.e("onCancelled", " cancelled");
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...