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
相关产品推荐
相关产品推荐

