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

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();
                    }
                });
            }
        });
    }
}

崩溃原因分析

  1. SOS_ID传递错误:在DetailSosActivity中,从Bundle获取sosId时误用了fvPhoneNumber作为键,导致拿到的不是数据库中SOS节点的真实ID。
  2. 空值未校验: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 05:38:12