存储到数据库时数据损坏,EditText输入与Firebase存储数据不匹配如何解决
问题根因
你代码中获取EditText输入内容的写法存在错误:直接调用binding.etName.toString()时,实际调用的是View类默认的toString()方法,返回的是EditText控件的类名、内存地址等对象标识字符串,并非用户输入的文本内容,这就是Firebase中出现异常数据的直接原因。
修复方案
所有获取EditText输入内容的位置,都需要先获取控件的text属性再转字符串,修正后的代码示例:
binding.btnUpload.setOnClickListener { showProgressBar() // 修正获取输入内容的写法 val name= binding.etName.text.toString() val fathers_name =binding.etFatherName.text.toString() val gender=binding.etGender.text.toString() val dob=binding.etDob.text.toString() val time_place = binding.etTimePlace.text.toString() val qualification = binding.etQualification.text.toString() val job = binding.etJob.text.toString() val Height = binding.etHeight.text.toString() val fathers_qualification = binding.etFatherQualification.text.toString() val requirement = binding.etRequirement.text.toString() val address = binding.etAddress.text.toString() val contact=binding.etContact.text.toString() val candidate= Candidates(name,fathers_name,gender,dob,time_place, qualification,job,Height,fathers_qualification,requirement,address, contact) database.child(System.currentTimeMillis().toString()).setValue(candidate).addOnCompleteListener{ if (it.isSuccessful){ uploadProfilePic() // 原逻辑错误:成功提示要放在成功分支内,避免失败也弹成功提示 Toast.makeText(this, "Successfully saved", Toast.LENGTH_SHORT).show() }else{ hideProgressBar() Toast.makeText(this, "Failed to upload profile", Toast.LENGTH_SHORT).show() } }.addOnFailureListener { hideProgressBar() Toast.makeText(this, "Failed", Toast.LENGTH_SHORT).show() } }
额外优化建议
- 提交数据前增加空校验,必填字段如果为空直接拦截提交,避免无效数据入库,示例:
if (name.isBlank()) { Toast.makeText(this, "请输入姓名", Toast.LENGTH_SHORT).show() return@setOnClickListener } - 建议调整上传逻辑:先上传图片拿到云端存储URL,再把图片URL和表单信息一起写入Firebase数据库,避免出现数据库已存数据但图片上传失败导致的数据不完整问题。
内容的提问来源于stack exchange,提问作者Harshad Raut
相关产品推荐
相关产品推荐

