Firebase实时数据库-更新多个表

时间:2020-04-13 10:45:21

标签: android firebase kotlin firebase-realtime-database

我需要一些帮助来了解如何同时更新多个表。

我有一个基本的更新表格:

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设置为Records表中的父项,并确保更新了正确的子记录。我还从记录表中删除了作为孩子的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个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)
                    }
                }
            })


如何将它们组合成一个功能?

1 个答案:

答案 0 :(得分:0)

这是因为Firebase-M4n2Tz9Ci_7anyOXOLo一起生成了随机字符串-M4n308C7tUZOIF9YCBPmDatabase.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...)