Мне нужна помощь в понимании того, как обновлять несколько таблиц одновременно.
У меня есть базовая c форма обновления:
![enter image description here](https://i.stack.imgur.com/EWNgz.jpg)
Эта форма обновляет таблицу пользователей и записей (связана с UID пользователя):
![enter image description here](https://i.stack.imgur.com/ynuXQ.jpg)
Впрочем, когда я обновляюсь, это нормально Уровень / Оценка снова:
![enter image description here](https://i.stack.imgur.com/1gnOV.jpg)
Вместо обновления существующей записи создается новая:
![enter image description here](https://i.stack.imgur.com/0bV1f.jpg)
Я знаю, что делаю что-то не так, мне просто нужно это указать.
Я подозреваю, что есть гораздо более эффективный способ сделать это.
Еще одна вещь, форма загружает только имя и адрес электронной почты в EditTexts, и я не знаю почему (я пытаюсь загрузить все 4).
![enter image description here](https://i.stack.imgur.com/JsArm.jpg)
Вот мой основной код активности, где происходят эти обновления.
Я удалил все, кроме необходимого кода:
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 в качестве родительского элемента в таблице записей и обеспечили обновление правильной дочерней записи. Я также удалил uid как ребенка в таблице записей.
Эта функция:
private fun updateRecord(level: String, score: String?) {
val record = Records(level, score)
mDatabase.child("Records").child(mAuth.currentUser!!.uid).setValue(record)
}
Теперь обновления обновляются следующим образом:
![enter image description here](https://i.stack.imgur.com/mZntP.jpg)
Кроме того, все 4 элемента EditTexts теперь заполнены, но с использованием двух функций, например:
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)
}
}
})
Как их объединить в одну функцию