【问题标题】:Firebase Realtime Databse - Updating Multiple TablesFirebase 实时数据库 - 更新多个表
【发布时间】: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


    【解决方案1】:

    这是因为Firebase 用你的mDatabase.child("Records").push().setValue(record) 生成随机字符串-M4n2Tz9Ci_7anyOXOLo & -M4n308C7tUZOIF9YCBP。它是不同的随机字符串,因此它会生成新行。 你也只得到了 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...)
    

    【讨论】:

    • 谢谢,这对我来说很有意义。让我改变一些事情并报告。
    • 好的,我现在明白了。谢谢你。我可能需要也可能不需要 UID 作为 Records 表中的父级,这取决于我的关系。如果可以,请在我的帖子中查看编辑 1。我可以在 EditTexts 中显示所有 4 个字段,但是有没有办法将它们组合成一个函数?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    • 2021-10-04
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多