我需要一些帮助来了解如何同时更新多个表。
我有一个基本的更新表格:
此表单更新了用户和记录表(通过用户UID链接):
这很好,但是,当我再次更新级别/分数时:
它不会更新现有记录,而是创建一个新记录:
我知道我做错了,我只需要指出来。
我怀疑这样做的效率更高。
还有一件事,该表单仅将名称和电子邮件加载到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)
}
}
谢谢,您提供的代码将UID设置为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)
}
}
})
如何将它们组合成一个功能?
答案 0 :(得分:0)
这是因为Firebase
与-M4n2Tz9Ci_7anyOXOLo
一起生成了随机字符串-M4n308C7tUZOIF9YCBP
和mDatabase.child("Records").push().setValue(record)
。它是不同的随机字符串,因此会产生新行。
您还只有2个数据,因为您不知道此随机字符串
[不确定,也许忽略了]为什么会生成随机字符串?因为您将一些值推入Record
,就像主文件夹(?)。某些值(级别,分数,uid)需要放在子文件夹中。 IDK,我不太确定要对此进行解释
解决这个问题。试试:
private fun updateRecord(uid: String, level: String, score: String?) {
val record = Records(uid, level, score)
mDatabase.child("Records").child(mAuth.currentUser!!.uid).setValue(record)
// mDatabase.child("Records").child(uid).setValue(record) /* or this should be fine i guess? */
}
现在,数据库应如下所示(如下)。并且应该进行更新,因为现在UID
是相同的
writedb-1a4bb
| -- Records
| | -- <UID>
| | -- level : "level 10"
| -- score : "10"
| -- uid : "<UID>" // maybe you don't need this anymore
| -- Users (same...)