'Android Studio, Error triying to delete Sql registry from custom listview button
First, I know this question must be done a million times, and I have read all of them but I can't get it to work. Have a Custom listview with delete button on each row. That part works fine, I can put the data of the object clicked on a Toastmessage or console, but when I try to implement the delete from db method, the app crashes with error:
" java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.File android.content.Context.getDatabasePath(java.lang.String)' on a null object reference "
Okay so now I shall share my codes with you. First the Controller class which holds all the methods for database transactions:
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);
}
}
Then the Custom adapter class
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;
}
}
The database Helper class
public class BaseDatos extends 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) {
}
}
main activity
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
Solution 1:[1]
Try this way:
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);
}
Put a break point on the line
// 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 ();
...
}
It is taking a different value from null, that is, the database.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Ramsha Omer |
