【问题标题】:How to update particular value of child in Firebase Database如何更新 Firebase 数据库中子项的特定值
【发布时间】:2021-04-02 15:20:14
【问题描述】:

我想更新最后一条消息,尝试了多种方法,但有点困惑更新最后一条消息的确切代码是什么。提前致谢。以下是我尝试过的代码:

databaseReference = FirebaseDatabase.getInstance().reference.child("user").child(apiKey)
        databaseReference.orderByChild("api_key").equalTo(loginModel.api_key).addValueEventListener(object : ValueEventListener{
            override fun onCancelled(error: DatabaseError) {

            }

            override fun onDataChange(snapshot: DataSnapshot) {
                if(snapshot.exists()){
                    val map = mutableMapOf<String, String>()
                    map["last_message"] = message
                    map["last_message_key"] = apiKey
                    //databaseReference.child("api_key").child(loginModel.api_key).updateChildren(map.toMap())
                    //databaseReference.updateChildren(map.toMap())
                    databaseReference.child(snapshot.key!!).setValue(chatUser)
                    Utils.showToast(requireContext(), "Exists")
                }else{
                    Utils.showToast(requireContext(), "Not Exists")
                    userReference.setValue(chatUser)
                }
            }
        })

【问题讨论】:

  • 您阅读过this part 的文档吗?如果有,具体有哪些不明白的地方?
  • 你能把你试过的多种方法贴出来吗?文档中有关于在特定位置覆盖数据的非常具体的示例。
  • 如果您已经尝试过某些方法但无法正常工作,请编辑您的问题以显示minimal code that any of us can run that reproduces where you got stuck
  • @srinij 请检查代码。

标签: android firebase kotlin firebase-realtime-database


【解决方案1】:

如果您发布了代码并解释了代码的结果以便我们更好地理解,将会很有用。 文档中的示例:mDatabase.child("users").child(userId).child("username").setValue(name); 您可以一直拨打.child 给您喜欢的孩子,然后拨打setValue()。 从您的代码来看,问题可能出在 snapshot.key!! 值上,该值似乎指向您的 apiKey 值。 你需要的是mDatabase.child("user").child("2c3e...").child("-MXH..").updateChildren()setValue() 将覆盖该节点中的所有内容。您应该调试以查看您在每个步骤中看到的值。

【讨论】:

    【解决方案2】:

    为了能够在使用查询时更新 Firebase 实时数据库中的属性,您应该直接在 DataSnapshot 对象上调用 getRef(),如以下代码行中所述:

    val rootRef = FirebaseDatabase.getInstance().reference
    val apiKeyRef = rootRef.child("user").child("apiKey")
    val query = apiKeyRef.orderByChild("api_key").equalTo(loginModel.api_key)
    val valueEventListener = object : ValueEventListener {
        override fun onDataChange(dataSnapshot: DataSnapshot) {
            if(dataSnapshot.exists()) {
                for (ds in dataSnapshot.children) {
                    val map = mutableMapOf<String, String>()
                    map["last_message"] = message
                    map["last_message_key"] = apiKey
                    ds.getRef().updateChildren(map)
                }
            }
        }
    
        override fun onCancelled(databaseError: DatabaseError) {
            Log.d("TAG", databaseError.getMessage()) //Don't ignore potential errors!
        }
    }
    query.addListenerForSingleValueEvent(valueEventListener)
    

    我还鼓励您为所有更新操作附加一个完整的侦听器,以便始终知道是否出现问题。

    【讨论】:

    • 嘿拉克什!您是否尝试过我上面的解决方案?如果您认为我的回答对您有所帮助,请考虑采纳(✔️)。我真的很感激。谢谢!
    【解决方案3】:

    我认为您应该使用update() 方法,而不是使用set() 方法。在该方法中,您传递对象,firebase 检测已更新的属性。我将它用于我的项目并且工作正常。

    【讨论】:

      猜你喜欢
      • 2017-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多