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

Android Studio中Firebase更新数据遇NullPointerException问题求助

Firebase CRUD更新操作NullPointerException解决方案

报错信息

java.lang.NullPointerException: Can't pass null for argument 'pathString' in child()

问题原因

报错指向updateLaundry方法中的child(getKey),说明getKey变量为null——即从Intent中获取的getPrimaryKey参数未正确传递或不存在。

解决方案

1. 确保跳转时正确传递主键参数

在跳转到UpdateLaundry的页面中,确认已将数据主键通过Intent传递:

Intent intent = new Intent(当前Activity.this, UpdateLaundry.class);
intent.putExtra("getPrimaryKey", 要更新的数据主键);
// 同时传递其他需要的参数(如dataNama、dataTempat等)
startActivity(intent);

2. 在更新方法中添加空值校验

修改updateLaundry方法,先检查主键是否为空,避免崩溃:

private void updateLaundry(Laundry ldry) {
    String getKey = getIntent().getExtras().getString("getPrimaryKey");
    
    // 校验主键是否为空
    if (TextUtils.isEmpty(getKey)) {
        Toast.makeText(UpdateLaundry.this, "数据主键缺失,无法执行更新", Toast.LENGTH_SHORT).show();
        return;
    }

    database.child("Admin")
            .child("Laundry")
            .child(getKey)
            .setValue(ldry)
            .addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void aVoid) {
                    namaBaru.setText("");
                    tempatBaru.setText("");
                    Toast.makeText(UpdateLaundry.this, "数据修改成功", Toast.LENGTH_SHORT).show();
                    finish();
                }
            });
}

3. 补充数据获取时的空值防护

优化getData方法,增加Intent参数的空值判断,避免潜在崩溃:

private void getData() {
    Bundle extras = getIntent().getExtras();
    if (extras == null) {
        Toast.makeText(this, "未获取到待更新数据", Toast.LENGTH_SHORT).show();
        finish();
        return;
    }

    String getNama = extras.getString("dataNama");
    String getTempat = extras.getString("dataTempat");
    String getKategori = extras.getString("dataKategori");
    String getJenis = extras.getString("dataJenis");

    if (getNama != null) namaBaru.setText(getNama);
    if (getTempat != null) tempatBaru.setText(getTempat);
    
    // 补充Spinner选中状态设置(当前代码未处理getJenis,需根据Spinner选项匹配设置)
    for (int i = 0; i < jenisBaru.getCount(); i++) {
        if (jenisBaru.getItemAtPosition(i).toString().equals(getJenis)) {
            jenisBaru.setSelection(i);
            break;
        }
    }
}

附用户提供的完整代码

import static android.text.TextUtils.isEmpty;
import android.annotation.SuppressLint;
import android.app.DatePickerDialog;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Spinner;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;

//import com.bumptech.glide.Glide;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;

import java.text.SimpleDateFormat;

public class UpdateLaundry extends AppCompatActivity {
//deklarasi variable
private EditText namaBaru, tempatBaru;
private Spinner jenisBaru;
private RadioButton ktgBaru, new_Rb1, new_Rb2, new_Rb3;
private Button update;
private DatabaseReference database;
private RadioGroup rgkategoriBaru;
private String cekNama, cekTempat, cekJenis, cekKategori;

@SuppressLint("WrongViewCast")
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_updatelaundry);

    namaBaru = findViewById(R.id.new_nama);
    tempatBaru = findViewById(R.id.new_lokasi);
    jenisBaru = findViewById(R.id.newspinner_jenis);
    update = findViewById(R.id.btn_update);
    new_Rb1 = findViewById(R.id.new_rb1);
    new_Rb2 = findViewById(R.id.new_rb2);
    new_Rb3 = findViewById(R.id.new_rb3);
    rgkategoriBaru = findViewById(R.id.new_rg_ktg);

    final String getKategori = getIntent().getExtras().getString("dataKategori");

    if (getKategori.equals("Cuci")) {
        new_Rb1.setChecked(true);
    } else if (getKategori.equals("Setrika")) {
        new_Rb2.setChecked(true);
    } else if (getKategori.equals("Cuci dan Setrika")) {
        new_Rb3.setChecked(true);
    }

    database= FirebaseDatabase.getInstance().getReference();
    getData();


    update.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            int pilihKtgBaru = rgkategoriBaru.getCheckedRadioButtonId();
            ktgBaru = findViewById(pilihKtgBaru);
            cekNama = namaBaru.getText().toString();
            cekTempat = tempatBaru.getText().toString();
            cekJenis = jenisBaru.getSelectedItem().toString();


//mengubah data databse menggunakan data yang baru di inputkan
            if (isEmpty(cekNama) || isEmpty(cekTempat)) {
                Toast.makeText(UpdateLaundry.this, "Data tidak boleh kosong", Toast.LENGTH_SHORT).show();
            } else {
                                /*Processing Update Data
                                Reload setter recomended to get new data from user*/

                Laundry setLaundry = new Laundry();
                setLaundry.setNama(namaBaru.getText().toString());
                setLaundry.setJenis(jenisBaru.getSelectedItem().toString());
                setLaundry.setTempat(tempatBaru.getText().toString());
                setLaundry.setKategori(ktgBaru.getText().toString());
                updateLaundry(setLaundry);

            }
        }
    });
}

private boolean isEmpty(String s){
    return TextUtils.isEmpty(s);
}

//mengambil data dari database ke form update
private void getData() {

    final String getNama = getIntent().getExtras().getString("dataNama");
    final String getTempat = getIntent().getExtras().getString("dataTempat");
    final String getKategori = getIntent().getExtras().getString("dataKategori");
    final String getJenis = getIntent().getExtras().getString("dataJenis");


    namaBaru.setText(getNama);
    tempatBaru.setText(getTempat);


}
private void updateLaundry(Laundry ldry) {

    String getKey = getIntent().getExtras().getString("getPrimaryKey");
    database.child("Admin")
            .child("Laundry")
            .child(getKey)
            .setValue(ldry)
            .addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void aVoid) {
                    namaBaru.setText("");
                    tempatBaru.setText("");

                    Toast.makeText(UpdateLaundry.this, "Data Berhasil diubah", Toast.LENGTH_SHORT).show();
                    finish();
                }
            });
}
}

内容的提问来源于stack exchange,提问作者M. Syahri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 10:55:17