You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用push在Firebase实时数据库存储两个键?Kotlin问题求助

问题解决:Firebase实时数据库push key不匹配的问题

你的代码核心问题是调用了两次push()方法:

  • 第一次referenciaBD.push().key生成了一个随机key并赋值给comentarioID
  • 第二次referenciaBD.push().setValue(comentarioMap)又生成了全新的随机key,这才是实际存储数据的节点key

两次push()会生成不同的随机key,自然导致存储的节点key和comentarioID不一致。解决办法是只调用一次push(),保存生成的引用后复用:

private fun guardarComentario(uidPostRecibido: String) {
    val comentarioMap = HashMap<String, Any>()
    val comentariosRef = FirebaseDatabase.getInstance().reference.child("Comentarios").child(uidPostRecibido)
    // 仅调用一次push(),获取包含唯一key的引用
    val nuevoComentarioRef = comentariosRef.push()
    val comentarioID = nuevoComentarioRef.key!!.toString()
    print(comentarioID)
    
    comentarioMap["comentarioID"] = comentarioID
    comentarioMap["publicacionID"] = uidPostRecibido
    comentarioMap["contenido"] = binding.etComentario.text.toString()
    comentarioMap["creadoPor"] = FirebaseAuth.getInstance().currentUser!!.uid
    comentarioMap["fecha"] = LocalDateTime.now().format(DateTimeFormatter.ofPattern("dd-MM-yyyy"))
    
    // 使用同一个引用执行存储操作,保证key一致
    nuevoComentarioRef.setValue(comentarioMap).addOnCompleteListener { task ->
        if (task.isSuccessful) {
            Toast.makeText(context, "COMENTARIO GUARDADO EN LA BASE DE DATOS CON EXITO", Toast.LENGTH_SHORT).show()
            anadirNotifcacion(uidPostRecibido)
            binding.etComentario.setText("")
        } else {
            Toast.makeText(context, "ERROR GUARDANDO EN LA BD", Toast.LENGTH_SHORT).show()
        }
    }
}

修改说明:

  1. 先通过一次push()获取nuevoComentarioRef,这个引用绑定了唯一的随机key
  2. 从该引用中提取key赋值给comentarioID
  3. 最终用同一个引用调用setValue(),确保存储的节点key与comentarioID完全匹配

内容的提问来源于stack exchange,提问作者Monrac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 11:50:20