Firebase数据库的setValue()和updateChildren()会覆盖先前的值

时间:2018-10-08 07:43:34

标签: android firebase firebase-realtime-database kotlin

我试图将新数据插入Firebase实时数据库的表中,但是setValue()updateChildren()都被先前的表和值覆盖。

我知道setValue()正在替换先前的数据,但就我而言,updateChildren()也在覆盖先前的数据。

Firebase console中,这两个方法似乎都是delete的上一个表并创建了一个新表。

Firebase console在执行updateChildren() enter image description here

我的代码错误吗?

我的数据库结构为:

enter image description here

-accounts
    - $userId
        - missions
            - $productId
                - ...

,代码为:

val missionsReference = FirebaseDatabase.getInstance().getReference("accounts").child(userId).child("missions")
val mission = Mission(product.id, product.imageUrl, product.title, product.logoUrl, remain.timeInMillis, "", -1, snsAddress)
missionsReference.child(product.id).setValue(mission)

val missionValue: Map<String, Any> = mission.toMap()
val missionUpdate: HashMap<String, Any> = HashMap()
missionUpdate[product.id] = missionValue
missionsReference.updateChildren(missionUpdate)
/* I also tried following methods, but it overwrites too.
FirebaseDatabase.getInstance().getReference("accounts/$userId/missions/${product.id}").setValue(mission)
missionsReference.push().setValue(mission)
*/

2 个答案:

答案 0 :(得分:2)

查看您的数据库结构并假设您必须实现以下目标:

Firebase-root
   |
   --- accounts
         |
         --- userId
               |
               --- missions
                     |
                     --- 0
                     |   |
                     |   --- //Mission details
                     |
                     --- 4
                         |
                         --- //Mission details

请使用以下代码行:

val missionsReference = FirebaseDatabase.getInstance().reference.child("accounts").child(userId).child("missions")
val mission = Mission(product.id, product.imageUrl, product.title, product.logoUrl, remain.timeInMillis, "", -1, snsAddress)
missionsReference.child("4").setValue(mission)

但是,我建议您使用child()函数生成的随机密钥,而不是将硬编码值传递给push()函数:

missionsReference.push().setValue(mission)

现在,您的数据库结构将如下所示:

Firebase-root
   |
   --- accounts
         |
         --- userId
               |
               --- missions
                     |
                     --- randomId
                     |   |
                     |   --- //Mission details
                     |
                     --- randomId
                         |
                         --- //Mission details

在这种情况下,不需要使用updateChildren()函数。此函数用于更新Mission对象下的属性,例如,如果要更改`imageUrl``属性。

答案 1 :(得分:0)

好的,我放弃了帐户表中的创建任务数组。我尝试过,而且行得通。

plm(Y~X, data=home, model = "within")
lm(Y~X+my_name, data=home)

我仍然不知道为什么该方法可行并且以前的方法无效。在我看来,这似乎是数据库级别(或深度?)的问题

Screenshot of Firebase console. it works