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