'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