【发布时间】:2020-04-13 20:59:45
【问题描述】:
我需要一些帮助来了解如何同时更新多个表。
我有一个基本的更新表格:
此表单更新用户和记录表(由用户 UID 链接):
这很好,但是,当我再次更新 Level/Score 时:
它不会更新现有记录,而是创建一个新记录:
我知道我做错了什么,我只是需要指出。
我怀疑有一种更有效的方法来做到这一点。
还有一件事,表单仅在 EditTexts 中加载名称和电子邮件,我不知道为什么(我正在尝试加载所有 4 个)。
这是我进行这些更新的主要活动代码。
我已删除除必要代码外的所有代码:
class MainActivity : AppCompatActivity() {
private lateinit var mUser: Users
private lateinit var mRecord: Records
private lateinit var mAuth : FirebaseAuth
private lateinit var mDatabase: DatabaseReference
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mAuth = FirebaseAuth.getInstance()
mDatabase = FirebaseDatabase.getInstance().reference
mDatabase.child("Users").child(mAuth.currentUser!!.uid)
.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onCancelled(p0: DatabaseError) {
TODO("Not yet implemented")
}
override fun onDataChange(p0: DataSnapshot) {
if (p0.hasChildren()) {
val user = p0.getValue(Users::class.java)
val record = p0.getValue(Records::class.java)
et_main_name.setText(user?.name)
et_main_email.setText(user!!.email)
et_main_level.setText(record?.level)
et_main_score.setText(record?.score)
}
}
})
bt_update_button.setOnClickListener {
val name = et_main_name.text.toString().trim()
val email = et_main_email.text.toString().trim()
val uid = mAuth.currentUser!!.uid
val level = et_main_level.text.toString().trim()
val score = et_main_score.text.toString().trim()
updateUser(name, email)
updateRecord(uid, level, score)
finish();
}
}
private fun updateUser(name: String, email: String?) {
val user = Users(name, email)
mDatabase.child("Users").child(mAuth.currentUser!!.uid).setValue(user)
}
private fun updateRecord(uid: String, level: String, score: String?) {
val record = Records(uid, level, score)
mDatabase.child("Records").push().setValue(record)
}
}
编辑 1
谢谢,您提供的代码将 UID 设置为 Records 表中的父项,并确保更新正确的子记录。我还在 Records 表中删除了作为孩子的 uid。
这个函数:
private fun updateRecord(level: String, score: String?) {
val record = Records(level, score)
mDatabase.child("Records").child(mAuth.currentUser!!.uid).setValue(record)
}
现在更新如下:
此外,现在填充了所有 4 个 EditText,但使用了两个函数,如下所示:
mDatabase.child("Users").child(mAuth.currentUser!!.uid)
.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onCancelled(p0: DatabaseError) {
TODO("Not yet implemented")
}
override fun onDataChange(p0: DataSnapshot) {
if (p0.hasChildren()) {
val user = p0.getValue(Users::class.java)
et_main_name.setText(user?.name)
et_main_email.setText(user!!.email)
}
}
})
mDatabase.child("Records").child(mAuth.currentUser!!.uid)
.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onCancelled(p0: DatabaseError) {
TODO("Not yet implemented")
}
override fun onDataChange(p0: DataSnapshot) {
if (p0.hasChildren()) {
val record = p0.getValue(Records::class.java)
et_main_level.setText(record?.level)
et_main_score.setText(record?.score)
}
}
})
如何将它们组合成一个函数?
【问题讨论】:
标签: android firebase kotlin firebase-realtime-database