Firebase Database更新数据时child()传null报错求助
解决Firebase数据库更新SOS数据时的崩溃问题
问题现象
更新Firebase Database中的SOS数据时应用频繁崩溃,报错信息:Can't pass null for argument 'pathString' in child(),定位到database.child(sosId)代码处,核心原因是sosId为空值。
数据库结构
SOS节点下以唯一ID作为子节点键,每个子节点包含fvName、typeSOS、sosAddress等业务字段。
相关代码
UpdateShelterActivity 代码
Bundle bundle = getIntent().getExtras(); if (bundle != null) { txtfvName.setText(bundle.getString("fvName")); txtHelp.setText(bundle.getString("typeSOS")); txtfvAddress.setText(bundle.getString("sosAddress")); txtStatus.setText(bundle.getString("sosStatus")); txtRemarkfv.setText(bundle.getString("victimRemark")); txtRemarkres.setText(bundle.getString("rescueRemark")); txtPhoneNum.setText(bundle.getString("fvPhoneNum")); sosId = bundle.getString("sosId"); } btnUpdate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { setdata(); updatedata(); startActivity(new Intent(updateSosFvActivity.this, sosListFvActivity.class)); } }); } public void setdata(){ txtfvName.setText(fvName); txtHelp.setText(typeSOS); txtfvAddress.setText(sosAddress); txtStatus.setText(sosStatus); txtRemarkfv.setText(victimRemark); txtRemarkres.setText(rescueRemark); txtPhoneNum.setText(fvPhoneNum); } public void updatedata() { fvName = txtfvName.getText().toString().trim(); typeSOS = spinHelp.getSelectedItem().toString().trim(); sosAddress = txtfvAddress.getText().toString().trim(); sosStatus = spinStatus.getSelectedItem().toString().trim(); victimRemark = txtRemarkfv.getText().toString().trim(); rescueRemark = txtRemarkres.getText().toString().trim(); fvPhoneNum = txtPhoneNum.getText().toString().trim(); HashMap p = new HashMap<>(); p.put("fvName", fvName); p.put("typeSOS", typeSOS); p.put("sosAddress", sosAddress); p.put("sosStatus", sosStatus); p.put("victimRemark", victimRemark); p.put("fvPhoneNum", txtPhoneNum); p.put("rescueRemark", rescueRemark); s = new sos(fvName,typeSOS,sosAddress,sosStatus,victimRemark,rescueRemark,fvPhoneNum); DatabaseReference reference = FirebaseDatabase.getInstance().getReference("SOS").child(sosId); reference.setValue(s).addOnCompleteListener(new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { if (task.isSuccessful()) { Toast.makeText(updateSosFvActivity.this, "Updated!", Toast.LENGTH_SHORT).show(); startActivity(new Intent(updateSosFvActivity.this, sosListFvActivity.class)); } else { Toast.makeText(updateSosFvActivity.this, "Failed!", Toast.LENGTH_SHORT).show(); } } }); } }
DetailSosActivity 代码
public class DetailSosActivity extends AppCompatActivity { TextView txtfvName,txtfvAddress, txtHelp,txtRemarkfv,txtStatus,txtRemarkres,txtPhoneNum; FloatingActionButton btnUpdate, btnDel; String sosId = ""; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.layout_detailsos); txtfvName = findViewById(R.id.txtfvName); txtfvAddress = findViewById(R.id.txtfvAddress); txtHelp = findViewById(R.id.txtHelp); txtRemarkfv = findViewById(R.id.txtRemarkfv); txtStatus = findViewById(R.id.txtStatus); txtRemarkres = findViewById(R.id.txtRemarkres); txtPhoneNum = findViewById(R.id.txtPhoneNum); btnDel = findViewById(R.id.btnDel); btnUpdate = findViewById(R.id.btnUpdate); Bundle bundle = getIntent().getExtras(); if(bundle != null){ sosId = bundle.getString("fvPhoneNumber"); txtfvName.setText((bundle.getString("fvName"))); txtHelp.setText((bundle.getString("typeSOS"))); txtfvAddress.setText((bundle.getString("sosAddress"))); txtStatus.setText((bundle.getString("sosStatus"))); txtRemarkfv.setText((bundle.getString("victimRemark"))); txtRemarkres.setText((bundle.getString("rescueRemark"))); txtPhoneNum.setText(bundle.getString("fvPhoneNum")); } btnUpdate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(DetailSosActivity.this,updateSosFvActivity.class) .putExtra("fvName",txtfvName.getText().toString()) .putExtra("typeSOS",txtHelp.getText().toString()) .putExtra("sosAddress",txtfvAddress.getText().toString()) .putExtra("sosStatus",txtStatus.getText().toString()) .putExtra("victimRemark",txtRemarkfv.getText().toString()) .putExtra("rescueRemark",txtRemarkres.getText().toString()) .putExtra("fvPhoneNum",txtPhoneNum.getText().toString()) .putExtra("sosId",sosId); startActivity(intent); } }); btnDel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final DatabaseReference reference = FirebaseDatabase.getInstance().getReference("SOS"); reference.removeValue().addOnSuccessListener(new OnSuccessListener<Void>() { @Override public void onSuccess(Void unused) { reference.child(sosId).removeValue(); Toast.makeText(DetailSosActivity.this, "Sos Deleted Successfully!", Toast.LENGTH_SHORT).show(); startActivity(new Intent(DetailSosActivity.this, HomeActivity.class)); finish(); } }); } }); } }
崩溃原因分析
- SOS_ID传递错误:在
DetailSosActivity中,从Bundle获取sosId时误用了fvPhoneNumber作为键,导致拿到的不是数据库中SOS节点的真实ID。 - 空值未校验:
updatedata()方法直接使用sosId构建数据库引用,未提前判断sosId是否为空,触发child(null)的非法调用。
修复方案
1. 修正DetailSosActivity中sosId的获取逻辑
确保从Bundle中获取正确的SOS节点ID,假设传递到DetailSosActivity的SOS ID键为sosId,修改代码:
if(bundle != null){ // 替换原错误键为正确的sosId键 sosId = bundle.getString("sosId"); // 其他字段赋值代码保持不变 }
2. 在updatedata()中增加空值校验
构建数据库引用前先检查sosId是否为空,避免非法调用:
public void updatedata() { // 原有字段获取代码不变... // 新增空值校验逻辑 if (TextUtils.isEmpty(sosId)) { Toast.makeText(updateSosFvActivity.this, "SOS ID为空,无法更新", Toast.LENGTH_SHORT).show(); return; } DatabaseReference reference = FirebaseDatabase.getInstance().getReference("SOS").child(sosId); // 后续更新逻辑不变... }
3. 修正删除逻辑错误(额外优化)
原删除代码先删除整个SOS节点再删除子节点,逻辑完全错误,修改为直接删除指定子节点:
btnDel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (TextUtils.isEmpty(sosId)) { Toast.makeText(DetailSosActivity.this, "SOS ID为空,无法删除", Toast.LENGTH_SHORT).show(); return; } DatabaseReference reference = FirebaseDatabase.getInstance().getReference("SOS").child(sosId); reference.removeValue().addOnSuccessListener(new OnSuccessListener<Void>() { @Override public void onSuccess(Void unused) { Toast.makeText(DetailSosActivity.this, "SOS删除成功!", Toast.LENGTH_SHORT).show(); startActivity(new Intent(DetailSosActivity.this, HomeActivity.class)); finish(); } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Toast.makeText(DetailSosActivity.this, "删除失败: " + e.getMessage(), Toast.LENGTH_SHORT).show(); } }); } });
内容的提问来源于stack exchange,提问作者Mayya
相关产品推荐
相关产品推荐

