База данных Firebase Realtime - обновление нескольких таблиц - PullRequest
0 голосов
/ 13 апреля 2020

Мне нужна помощь в понимании того, как обновлять несколько таблиц одновременно.

У меня есть базовая c форма обновления:

enter image description here

Эта форма обновляет таблицу пользователей и записей (связана с UID пользователя):

enter image description here

Впрочем, когда я обновляюсь, это нормально Уровень / Оценка снова:

enter image description here

Вместо обновления существующей записи создается новая:

enter image description here

Я знаю, что делаю что-то не так, мне просто нужно это указать.
Я подозреваю, что есть гораздо более эффективный способ сделать это.


Еще одна вещь, форма загружает только имя и адрес электронной почты в EditTexts, и я не знаю почему (я пытаюсь загрузить все 4).

enter image description here

Вот мой основной код активности, где происходят эти обновления.
Я удалил все, кроме необходимого кода:

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



Кроме того, все 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)
                    }
                }
            })


Как их объединить в одну функцию

1 Ответ

0 голосов
/ 13 апреля 2020

Это потому, что Firebase генерирует случайную строку -M4n2Tz9Ci_7anyOXOLo & -M4n308C7tUZOIF9YCBP с вашим mDatabase.child("Records").push().setValue(record). Это другая случайная строка, поэтому она создает новую строку. Вы также получили только 2 данных, потому что вы не знаете эту случайную строку

[Не уверен, может быть, проигнорировано это] Почему она генерирует случайную строку? Потому что вы набираете sh некоторых значений до Record, что похоже на основную папку (?). Это некоторые значения (уровень, оценка, UID) необходимо поместить в подпапку. ИДК, я не совсем уверен, чтобы объяснить это


, чтобы решить это. Попробуйте:

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...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...