Firebase 实时数据库 setValue() 不工作

Posted

技术标签:

【中文标题】Firebase 实时数据库 setValue() 不工作【英文标题】:Firebase realtime database setValue() not working 【发布时间】:2021-07-13 03:26:24 【问题描述】:

我正在尝试将有关用户的一些基本信息写入 Firebase 实时数据库,但在运行 setValue() 时,控制台中没有任何反应,经过数小时的尝试后,我仍然无法找出问题所在。

这是片段中调用registerUser函数的代码:

registerButton.setOnClickListener 

        firstNameLayout.error = null
        lastNameLayout.error = null
        emailFieldLayout.error = null
        passwordFieldLayout.error = null

        var fieldCheck = true

        if(TextUtils.isEmpty(firstNameField.text)) 
            firstNameLayout.error = "Please Enter First Name";
            fieldCheck = false
        
        if (TextUtils.isEmpty(lastNameField.text)) 
            lastNameLayout.error = "Please Enter Last Name"
            fieldCheck = false
        
        if(TextUtils.isEmpty(emailField.text)) 
            emailFieldLayout.error = "Please Enter Email Address";
            fieldCheck = false
            // Todo: Make sure format is correct
        
        if(TextUtils.isEmpty(passwordField.text))
            passwordFieldLayout.error = "Please Choose a Password"
            fieldCheck = false
            // Todo: Stricter password requirements 
        
        if(!fieldCheck) 
            return@setOnClickListener
        

        registerButton.startAnimation()

        val fName = firstNameField.text.toString().trim()
        val lName = lastNameField.text.toString().trim()
        val email = emailField.text.toString().trim()
        val password = passwordField.text.toString().trim()

        try 
            registerButton.doneLoadingAnimation(2, bitmap)
            (activity as LoginRegister).registerUser(email, password, fName, lName)

         catch (e: Exception) 
            Toast.makeText(activity, e.message, Toast.LENGTH_SHORT).show()
            registerButton.revertAnimation()
        

    

这是来自片段父活动的 registerUser 函数体:

fun registerUser(email: String, password: String, fName: String, lName: String) 
    //Registrerer med Firebase Authentication
    auth.createUserWithEmailAndPassword(email, password)
        .addOnCompleteListener(this)  task ->
            if (task.isSuccessful) 
                // Sign in success, update UI with the signed-in user's information
                Log.d(TAG, "createUserWithEmail:success")
                val user : FirebaseUser = task.result!!.user!!
                val uid: String = user.uid
                val dbUser = User(fName, lName, email)

                writeNewUser(uid, dbUser)

                val intent = Intent(this@LoginRegister, MainActivity::class.java)
                intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
                intent.putExtra("user_email", email)
                intent.putExtra("user_first_name", fName)
                intent.putExtra("user_last_name", lName)
                startActivity(intent)
                finish()

             else 
                // If sign in fails, display a message to the user.
                Log.w(TAG, "createUserWithEmail:failure", task.exception)
                Toast.makeText(baseContext, "Authentication failed.", Toast.LENGTH_SHORT).show()
            
        




这是 writeNewUser 函数体

fun writeNewUser(userId: String, user: User) 
    database = FirebaseDatabase.getInstance().getReference("Users").child(userId)
    database.child("users").child(userId).setValue(user)

从这个 kotlin 类实例化 User 对象:

data class User(val fName: String? = null, val lName: String? = null, val email: String? = null) 
val firstName = fName?.capitalize(Locale.ROOT)
val lastName = lName?.capitalize(Locale.ROOT)
val emailAddress = email

Firebase:

Firebase nodes

有人知道这背后的原因吗?

【问题讨论】:

您是否尝试将 Complete 侦听器附加到 setValue() 操作,看看是否有问题? 【参考方案1】:

我解决了这个问题,我使用的不是默认的数据库位置,但我没有意识到我需要在 getInstance() 方法中传递数据库 URL。传递正确的数据库 url 解决了问题

【讨论】:

【参考方案2】:

将数据库的URL 放入getInstance() 是我的解决方案,现在它完美运行

示例:

private val database = FirebaseDatabase.getInstance("https://conect-c91b3-default-rtdb.firebaseio.com/").getReference()

// to test if is working
database.child("users").setValue("test")

【讨论】:

【参考方案3】:
fun writeNewUser(userId: String, user: User) 
    database = FirebaseDatabase.getInstance().getReference("Users").child(userId)
    database.child("users").child(userId).setValue(user)

我猜你在上面的 sn-p 中复制了几个子节点,因为这意味着一组用户有一个用户,而这个特定的用户有一组用户,没有意义,所以你可以删除这些重复:

fun writeNewUser(userId: String, user: User) 
    database = FirebaseDatabase.getInstance().getReference("Users").child(userId)
    database.setValue(user)

更新:

firebase 节点区分大小写,因此将“Users”更改为小写“users”

fun writeNewUser(userId: String, user: User) 
    database = FirebaseDatabase.getInstance().getReference("users").child(userId)
    database.setValue(user)

【讨论】:

感谢您的意见。我更改了副本,但仍然没有任何内容写入数据库 @petter-odden 能否提供 Firebase 上节点的层次结构 添加了数据库结构的图像。我知道 writeNewUser 函数中“Users”的大写,它已更改为“users” @petter-odden 感谢检查更新的答案.. 希望它现在可以工作 是的,谢谢,我已经修复了大小写问题,但遗憾的是它没有改变..

以上是关于Firebase 实时数据库 setValue() 不工作的主要内容,如果未能解决你的问题,请参考以下文章

Android-从Firebase实时数据库读取数据并显示在RecyclerView上

从Firebase实时数据库读取Android数据并在RecyclerView上显示

DatabaseReference setValue 像在循环中一样工作

在 Swift 3 中将数据添加到 Firebase 而不是 SetValue

Firebase 聊天应用 setValue 在公共数据库中失败?

Firebase 数据库中的 setValue() 方法不起作用。值未添加到数据库中