Android Studio,尝试从自定义列表视图按钮中删除Sql注册表时出错



首先,我知道这个问题必须做一百万次,我已经读了所有的,但我无法让它发挥作用。有一个自定义列表视图,每行都有删除按钮。这部分工作得很好,我可以把点击的对象的数据放在Toast消息或控制台上,但当我试图实现从数据库删除方法时,应用程序崩溃并出现错误:

"java.lang.NullPointerException:尝试在null对象引用上调用虚拟方法"java.io.File android.content.Context.getDatabasePath(java.lang.String(";

好的,现在我将与您分享我的代码。首先是Controller类,它包含数据库事务的所有方法:

public class ControllerQuirofanos {

private BaseDatos db;

public ControllerQuirofanos(Context contexto) {

db = new BaseDatos(contexto);
}

//THIS IS THE DELETE METHOD
public void borrarAlgo (long id) {
SQLiteDatabase baseDeDatos = db.getWritableDatabase();
String[] argumentos = {String.valueOf(id)};
baseDeDatos.delete("quirofanos", "id = ?", argumentos);
}

public boolean delete(long id)
{
try
{
SQLiteDatabase baseDeDatos = db.getWritableDatabase();
int result=baseDeDatos.delete("quirofanos","id=?",new String[]{String.valueOf(id)});
if(result>0)
{
return true;
}

}catch (SQLException e)
{
e.printStackTrace();
}

return false;
}


public long nuevoQuirofano(Quirofano quirofano) {
// writable porque vamos a insertar
SQLiteDatabase baseDeDatos = db.getWritableDatabase();
ContentValues valoresParaInsertar = new ContentValues();
valoresParaInsertar.put("nombre", quirofano.getNombre());
return baseDeDatos.insert("quirofanos", null, valoresParaInsertar);
}

//listar
public ArrayList<Quirofano> obtenerQuirofanos() {
ArrayList<Quirofano> quirofanos = new ArrayList<>();
SQLiteDatabase baseDeDatos = db.getReadableDatabase();
String[] columnasAConsultar = {"id","nombre"};
Cursor cursor = baseDeDatos.query(
"quirofanos",
columnasAConsultar,
null,
null,
null,
null,
null
);

if (cursor == null) {
/*
Salimos aquí porque hubo un error, regresar
lista vacía
*/
return quirofanos;

}
if (!cursor.moveToFirst()) return quirofanos;

do {
long idQuirofano = cursor.getLong(0);
String nombreObtenidoDeBD = cursor.getString(1);
Quirofano personaObtenidaDeDB = new Quirofano(idQuirofano,nombreObtenidoDeBD);
quirofanos.add(personaObtenidaDeDB);
} while (cursor.moveToNext());

cursor.close();
return quirofanos;
}


//borrarTodo
public void borrarTodo(){
SQLiteDatabase baseDeDatos = db.getWritableDatabase();
baseDeDatos.delete("quirofanos", null, null);
}
}

然后自定义适配器类

public class Adaptador_lista_quirofanos extends BaseAdapter implements ListAdapter {
private ArrayList<Quirofano> list;
private Context context;
final ControllerQuirofanos controller = new ControllerQuirofanos(context) ;


public Adaptador_lista_quirofanos(ArrayList<Quirofano> list, Context context) {
this.list = list;
this.context = context;
}

@Override
public int getCount() {
return list.size();
}

@Override
public Object getItem(int pos) {
return list.get(pos);
}

@Override
public long getItemId(int pos) {
return list.get(pos).getId();
//just return 0 if your list items do not have an Id variable.
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.fila_quirofano, null);
}

//Handle TextView and display string from your list
TextView listItemText = view.findViewById(R.id.tv_fila_quirofano);
listItemText.setText(list.get(position).getNombre());

//Handle buttons and add onClickListeners
Button deleteBtn = view.findViewById(R.id.btn_eliminar_lista_quirofano);

deleteBtn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
final long id_a_eliminar = list.get(position).getId();
list.remove(position); //or some other task
notifyDataSetChanged(); //this works
System.out.println(id_a_eliminar); //this works
controller.borrarAlgo(id_a_eliminar); //this is where the app crash

}
});

listItemText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String quirofanoClicado = list.get(position).getNombre();
Toast.makeText(context.getApplicationContext(), "Clicaste a " + quirofanoClicado, Toast.LENGTH_SHORT).show();
}
});

return view;
}
}

数据库Helper类

公共类BaseDatos扩展了SQLiteOpenHelper{

public BaseDatos(Context context) {
super(context, "administrador.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(String.format("CREATE TABLE IF NOT EXISTS %s(id integer primary key autoincrement, nombre text)", "quirofanos"));
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}

主要活性

package com.example.prueba;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {

private EditText txtNuevo;
private ImageButton btnNuevo;
private ListView lv_quirofanos;
private ControllerQuirofanos controller;
private Button wipear;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txtNuevo =  findViewById(R.id.txtNuevo);
btnNuevo =  findViewById(R.id.btnNuevo);
lv_quirofanos =  findViewById(R.id.lv_quirofanos);
controller= new ControllerQuirofanos(MainActivity.this);
wipear =  findViewById(R.id.wipe);

// Agregar listener del botón de guardar
btnNuevo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Resetear errores a ambos
txtNuevo.setError(null);
String nombre = txtNuevo.getText().toString();
if ("".equals(nombre)) {
txtNuevo.setError("Escribe el nombre del Quirófano");
txtNuevo.requestFocus();
return;
}
// Ya pasó la validación
Quirofano newQuirofano = new Quirofano(nombre);
long id = controller.nuevoQuirofano(newQuirofano);
if (id == -1) {
// De alguna manera ocurrió un error
Toast.makeText(MainActivity.this, "Error al guardar. Intenta de nuevo", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "Quirófano Agregado!", Toast.LENGTH_SHORT).show();
cargarLista();
}
}
});
wipear.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
controller.borrarTodo();
Toast.makeText(MainActivity.this, "Todos registros eliminados amigo", Toast.LENGTH_SHORT).show();
cargarLista();
}
});
//llenar arraylist con lo que haya en la db
cargarLista();
}//on create
//charge the listview
public void cargarLista () {
Adaptador_lista_quirofanos adaptador_lista_quirofanos = new Adaptador_lista_quirofanos(controller.obtenerQuirofanos(), this);
lv_quirofanos.setAdapter(adaptador_lista_quirofanos);
}

}//class

试试这个方法:

private static String NAME_COL = "id";
private static String TABLE_NAME = "quirofanos";
public void borrarAlgo (long id) {
SQLiteDatabase baseDeDatos = db.getWritableDatabase();
String idConv = String.valueOf(id);
// -1 is that it failed to delete
int deleteRow = baseDeDatos.delete(TABLE_NAME, NAME_COL+ "= '" + idConv + "'", null);
}

在线上设置断点

// THIS IS THE DELETE METHOD
         public void delete Something (long id) {
             ...
--------> String idConv = String.valueOf (id);

             ...
         }
Check that
public void delete Something (long id) {
...
      ------> SQLiteDatabase databaseData = db.getWritableDatabase ();
             
...
         }

它采用了一个不同于null的值,即数据库。

最新更新