Search code examples
android-studioandroid-sqlite

How do I delete a certain item using a button from a sqlite database


I am trying to have a button delete a certain item from the list depending on the ID of the item, I've added a delete button for each item in the list view but every time I click the button the app crashes, I am getting a null object error. I want to know what I am doing wrong

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.streetsafe, PID: 15517
    java.lang.NullPointerException: Attempt to invoke virtual method 'void com.example.streetsafe.DatabaseHelper.deleteItem(int)' on a null object reference
        at com.example.streetsafe.AdapterSearch.ListAdapterDelete$1.onClick(ListAdapterDelete.java:80)
        at android.view.View.performClick(View.java:7448)
        at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:992)
        at android.view.View.performClickInternal(View.java:7425)
        at android.view.View.access$3600(View.java:810)
        at android.view.View$PerformClick.run(View.java:28305)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

` Delete in database helper class

public void deleteItem(int getID) {
        SQLiteDatabase db = this.getWritableDatabase();
        db.execSQL("DELETE from crimes_table  WHERE ID= '" +getID+ "'");
    }

List adapter class

public class ListAdapterDelete extends ArrayAdapter<CrimesDelete> {
    private Context context;
    private List<CrimesDelete> crime;
    ArrayAdapter<String> adapter;
    DatabaseHelper DB_CRIME;

    public ListAdapterDelete(Context context, List<CrimesDelete> crime){
        super(context, R.layout.list_layout_delete, crime);
        this.context = context;
        this.crime = crime;
    }

    @NonNull
    @Override
    //Method generates the display for the list view
    public View getView(int position, @Nullable View view, @NonNull ViewGroup parent) {
        //ViewHolder describes the view of each text coming from the database
        ViewHolder viewHolder;
        if (view == null) {
            viewHolder = new ViewHolder();
            view = LayoutInflater.from(context).inflate(R.layout.list_layout_delete, null);
            viewHolder.textDisplayId = view.findViewById(R.id.textDisplayId);
            viewHolder.textDisplayLocationHeading = view.findViewById(R.id.textDisplayLocationHeading);
            viewHolder.textDisplayLocation = view.findViewById(R.id.textDisplayLocation);
            viewHolder.textDisplayTypeHeading = view.findViewById(R.id.textDisplayTypeHeading);
            viewHolder.textDisplayTypeHeading = view.findViewById(R.id.textDisplayTypeHeading);
            viewHolder.textDisplayType = view.findViewById(R.id.textDisplayType);
            viewHolder.textDisplayDescriptionHeading = view.findViewById(R.id.textDisplayDescriptionHeading);
            viewHolder.textDisplayDescription = view.findViewById(R.id.textDisplayDescription);
            viewHolder.textDisplayDateHeading = view.findViewById(R.id.textDisplayDateHeading);
            viewHolder.textDisplayDate = view.findViewById(R.id.textDisplayDate);
            viewHolder.textDisplayTimeHeading = view.findViewById(R.id.textDisplayTimeHeading);
            viewHolder.textDisplayTime = view.findViewById(R.id.textDisplayTime);
            viewHolder.textDisplayRatingHeading = view.findViewById(R.id.textDisplayRatingHeading);
            viewHolder.textDisplayRating = view.findViewById(R.id.textDisplayRating);
            viewHolder.btnDisplayDelete = view.findViewById(R.id.btnDelete);
            view.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) view.getTag();
        }
        //Gets the content from the crimes list and puts them into the text boxes
        CrimesDelete crimes = crime.get(position);
        viewHolder.textDisplayId.setText(String.valueOf(crimes.getID()));
        viewHolder.textDisplayLocationHeading.setText("Location:");
        viewHolder.textDisplayLocation.setText(crimes.getLOCATION() );
        viewHolder.textDisplayTypeHeading.setText("Type of Crime:");
        viewHolder.textDisplayType.setText(crimes.getTYPE());
        viewHolder.textDisplayDescriptionHeading.setText("Description:");
        viewHolder.textDisplayDescription.setText(crimes.getDESCRIPTION());
        viewHolder.textDisplayDateHeading.setText("Date:");
        viewHolder.textDisplayDate.setText(crimes.getDATE());
        viewHolder.textDisplayTimeHeading.setText("Time:");
        viewHolder.textDisplayTime.setText(crimes.getTIME());
        viewHolder.textDisplayRatingHeading.setText("Danger Rating:");
        viewHolder.textDisplayRating.setText(crimes.getRATING());
        viewHolder.btnDisplayDelete.setText("Delete");
        viewHolder.btnDisplayDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DB_CRIME.deleteItem(crimes.getID());
                crime.remove(position);
                notifyDataSetChanged();
            }
        });
        return view;
    }
    private static class ViewHolder {
        public TextView textDisplayId;
        public TextView textDisplayLocationHeading;
        public TextView textDisplayLocation;
        public TextView textDisplayTypeHeading;
        public TextView textDisplayType;
        public TextView textDisplayDescriptionHeading;
        public TextView textDisplayDescription;
        public TextView textDisplayDateHeading;
        public TextView textDisplayDate;
        public TextView textDisplayTimeHeading;
        public TextView textDisplayTime;
        public TextView textDisplayRatingHeading;
        public TextView textDisplayRating;
        public TextView btnDisplayDelete;
    }
}

Solution

  • As I see variable DB_CRIME is never initialized.