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

Android Kotlin中Firebase非用户数据更新问题:无法获取节点Key

解决Firebase Realtime Database无法更新指定节点的问题

问题核心

上传数据时用push()生成了唯一节点Key,但跳转至更新页面时未传递该Key,导致更新代码无法定位到目标节点,反而创建了名为key的新子节点。同时更新逻辑中存在判断条件错误(空值时执行更新)。

解决方案步骤

  • 上传成功后,将生成的uploadId(节点Key)通过Intent传递到更新页面
  • 在更新页面接收并存储该Key
  • 使用正确的Key定位目标节点,更新feedback字段

修改后的上传代码

mDatabaseRef = FirebaseDatabase.getInstance().getReference("Reports_uploads")

val upload = Reportsreq(
    name = binding.nameEditText.text.toString().trim { it <= ' ' },
    imageUrl = mImageUri.toString(),
    email = binding.spinneremail.selectedItem.toString().trim(),
    feedback =  binding.descriptionEditText.text.toString().trim { it <= ' ' },
)
val uploadId = mDatabaseRef!!.push().key ?: return // 空值判断避免崩溃
mDatabaseRef!!.child(uploadId).setValue(upload).addOnSuccessListener {
    // 上传成功后传递key到更新页面
    val intent = Intent(this, 你的更新页面类名::class.java).apply {
        putExtra("key", uploadId)
        putExtra("Email", upload.email)
        putExtra("Name", upload.name)
        putExtra("DESCRIT", upload.feedback)
        putExtra("IMGURI", upload.imageUrl)
    }
    startActivity(intent)
}

修改后的更新代码

val intss = intent
val key = intss.getStringExtra("key") ?: run {
    Toast.makeText(this, "无法获取目标节点Key", Toast.LENGTH_SHORT).show()
    finish()
    return
}
val email = intss.getStringExtra("Email")
val name  = intss.getStringExtra("Name")
val desT  = intss.getStringExtra("DESCRIT")
val imgT  = intss.getStringExtra("IMGURI")

binding.nameDetailTextView.text = name
binding.descriptionDetailTextView.text = desT
binding.emailTextView.text = email
binding.teacherDetailImageView.loadImage(imgT)

val database = FirebaseDatabase.getInstance().getReference("Reports_uploads")
binding.updatebtn.setOnClickListener {
    val feed = binding.updatefeedback.text.toString().trim()
    if (feed.isNotEmpty()) { // 修正判断条件:非空才更新
        database.child(key).child("feedback").setValue(feed)
            .addOnSuccessListener {
                Toast.makeText(this, "更新成功", Toast.LENGTH_SHORT).show()
            }
            .addOnFailureListener {
                Toast.makeText(this, "更新失败:${it.message}", Toast.LENGTH_SHORT).show()
            }
    } else {
        Toast.makeText(this, "请填写反馈内容", Toast.LENGTH_SHORT).show()
    }
}

关键说明

  • push().key生成的是节点的唯一标识,必须在上传后传递给后续操作页面
  • 避免硬编码节点名称(如原代码中的child("key")),必须使用实际获取到的节点Key
  • 网络操作建议添加addOnSuccessListener和addOnFailureListener处理结果,提升用户体验
  • 对Intent传递的参数做空值判断,避免空指针异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 16:01:08