【问题标题】:How to display username from Firebase Realtime Database in Kotlin?如何在 Kotlin 中显示来自 Firebase 实时数据库的用户名?
【发布时间】:2020-11-02 12:51:52
【问题描述】:

我正在尝试显示实时数据库中的当前用户名,但每当我运行我的代码时,它都会给我 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)
}

这是我可以上传图片的代码。我已经从互联网上获得了一些帮助来做到这一点。我正在尝试在此处显示名称,但它没有返回任何内容

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()
}

【问题讨论】:

    标签: android firebase kotlin firebase-realtime-database firebase-authentication


    【解决方案1】:

    试试这个代码:

     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) {}
        })
    

    【讨论】:

    • 不,先生,它不工作它正在返回“Hello null”
    • 我已经对我的帖子进行了编辑,您现在可以重试新代码吗!
    • 先生,当我写“for(dataSnapShot 中的快照)”时,它返回错误“For 循环范围必须有一个迭代器方法”
    • 对不起,伙计,您必须在 for 循环中将 .children 添加到 datasnapshot 中,我编辑了文本,再次检查
    • 不,先生,它仍然没有给我任何回报
    【解决方案2】:

    正如我在您的数据库中看到的,存储在 Users 节点中的所有 User 对象的密钥不是使用来自身份验证过程的 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)
    

    【讨论】:

    • 没有先生代码不起作用。它什么也没返回
    • 在这种情况下,请添加您数据库的屏幕截图以查看实际的 UID 而不是那些推送的 ID,还请编辑您的问题以查看您正在使用的更改代码。
    • 先生,我已经添加了实时数据库的截图
    • 你没有。我仍然可以看到旧的。请您使用 UID 而不是那些推送的 ID。
    • 嗨,布本!您是否在我上面的回答中尝试过我的解决方案?
    猜你喜欢
    • 1970-01-01
    • 2020-07-23
    • 2019-02-08
    • 2021-08-23
    • 2020-02-01
    • 1970-01-01
    • 2022-12-08
    • 2018-08-30
    • 2019-05-24
    相关资源
    最近更新 更多