Как отобразить имя пользователя из базы данных Firebase Realtime в Kotlin? - PullRequest
0 голосов
/ 13 июля 2020

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

    val reference =FirebaseDatabase.getInstance().reference
    currentUserUid = auth?.currentUser?.uid
    reference.addValueEventListener(object : ValueEventListener {
        override fun onDataChange(dataSnapshot: DataSnapshot) {
            val username =
                dataSnapshot.child(auth!!.currentUser!!.uid).child("Users")
                    .child("username")
                    .getValue(String::class.java)
            if (username == null)
                fragmentView?.name?.setText("Hello, Anonymous")
            else
                fragmentView?.name?.setText("Hello, $username")
        }

        override fun onCancelled(databaseError: DatabaseError) {}
    })

введите описание изображения здесь

Это мой контент для кода

package com.example.videoapp.Model

data class ContentDTO(var explain : String? = null,
                      var imageUrl : String? = null,
                      var uid : String? = null,
                      var userId : String? = null,
                      var username : String? = null,
                      var timestamp : Long? = null,
                      var favoriteCount : Int = 0,
                      var favorites : MutableMap<String,Boolean> = HashMap()){
    data class Comment(var uid : String? = null,
                       var userId : String? = null,
                       var comment : String? = null,
                       var timestamp : Long? = null)
}

Это мой код, в который я могу загружать фотографии. Для этого мне потребовалась небольшая помощь от inte rnet. Я пытаюсь отобразить здесь имя, но ничего не возвращает

val storageRef = storage?.reference?.child("images")?.child(imageFileName)
storageRef?.putFile(photoUri!!)?.continueWithTask { task: com.google.android.gms.tasks.Task<com.google.firebase.storage.UploadTask.TaskSnapshot> ->
    return@continueWithTask storageRef.downloadUrl
}?.addOnSuccessListener { uri ->
    val contentDTO = com.example.videoapp.Model.ContentDTO()

    //Insert downloadUrl of image
    contentDTO.imageUrl = uri.toString()

    //Insert uid of user
    contentDTO.uid = auth?.currentUser?.uid

    //Insert userId
    contentDTO.userId = auth?.currentUser?.email
    contentDTO.username = auth?.currentUser?.displayName

    //Insert explain of content
    contentDTO.explain = addphoto_edit_explain2.text.toString()

    //Insert timestamp
    contentDTO.timestamp = System.currentTimeMillis()

    firestore?.collection("images")?.document()?.set(contentDTO)

    setResult(android.app.Activity.RESULT_OK)

    finish()
}

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

Как я вижу в вашей базе данных, ключи всех User объектов, которые хранятся в узле Users, не добавляются с использованием UID, полученного в процессе аутентификации, эти ключи как сгенерировано с помощью метода push(), потому что все они начинаются с -.

Наиболее подходящим решением может быть изменение этих ключей и получение соответствующих данных. Чтобы добавить объект User, вам нужно несколько строк кода, которые выглядят следующим образом:

val uid = FirebaseAuth.getInstance().currentUser!!.uid
val rootRef = FirebaseDatabase.getInstance().reference
val usersRef = rootRef.child("Users")
usersRef.child(uid).setValue(user)

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

val valueEventListener = object : ValueEventListener {
    override fun onDataChange(dataSnapshot: DataSnapshot) {
        val name = dataSnapshot.child("name").getValue(String::class.java)
        Log.d("TAG", name)

        //Do what you need to do with the value of name
    }

    override fun onCancelled(databaseError: DatabaseError) {
        Log.d("TAG", databaseError.getMessage()) //Don't ignore errors!
    }
}
usersRef.child(uid).addListenerForSingleValueEvent(valueEventListener)
0 голосов
/ 13 июля 2020

Попробуйте вместо этого этот код:

 val reference = FirebaseDatabase.getInstance().getReference("Users").child(auth?.currentUser?.uid)
    reference.addValueEventListener(object : ValueEventListener {
        override fun onDataChange(dataSnapshot: DataSnapshot) {
           for(snapshot in dataSnapShot.children){
          val username = 
               snapshot.child("username").value.toString()
            if (username == null)
                fragmentView?.name?.setText("Hello, Anonymous")
            else
                fragmentView?.name?.setText("Hello, $username")
        }        
                     }
          

        override fun onCancelled(databaseError: DatabaseError) {}
    })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...