Attempt to invoke virtual method on a null object reference, при попытке передать в базу данных текст из EditText

Создаю приложение "Планировщик задач", при попытке сохранить текст из EditView в базу данных SQLite выдаёт ошибку и вылетает.

Код Activity_Main:

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/todo_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/main_bgcolor"
    tools:context=".MainActivity">


    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/todo_layout"
        android:layout_width="290dp"
        android:layout_height="300dp"
        android:layout_marginStart="62dp"
        android:layout_marginTop="30dp"
        android:layout_marginEnd="62dp"
        android:background="@drawable/shape"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <EditText
            android:id="@+id/taskfive"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:layout_marginEnd="15dp"
            android:autofillHints=""
            android:background="@color/layout_color"
            android:ems="10"
            android:fontFamily="@font/roboto_regular"
            android:hint="@string/enter_ur_task"
            android:inputType="textPersonName"
            android:textColor="@color/white"
            android:textColorHint="#5A5A5A"
            android:textSize="20sp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/taskfour"
            tools:ignore="TextContrastCheck,TouchTargetSizeCheck,DuplicateSpeakableTextCheck" />

        <CheckBox
            android:id="@+id/checkBoxThree"
            android:layout_width="30dp"
            android:layout_height="47dp"
            android:clickable="true"
            android:scaleX="1.1"
            android:scaleY="1.1"
            android:theme="@style/CheckBox"
            app:layout_constraintBottom_toBottomOf="@+id/taskthree"
            app:layout_constraintEnd_toStartOf="@+id/taskthree"
            app:layout_constraintTop_toTopOf="@+id/taskthree"
            tools:ignore="TouchTargetSizeCheck,DuplicateSpeakableTextCheck" />

        <EditText
            android:id="@+id/taskfour"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:layout_marginEnd="15dp"
            android:autofillHints=""
            android:background="@color/layout_color"
            android:ems="10"
            android:fontFamily="@font/roboto_regular"
            android:hint="@string/enter_ur_task"
            android:inputType="textPersonName"
            android:textColor="@color/white"
            android:textColorHint="#5A5A5A"
            android:textSize="20sp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/taskthree"
            tools:ignore="TextContrastCheck,TouchTargetSizeCheck,DuplicateSpeakableTextCheck" />

        <EditText
            android:id="@+id/taskthree"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:layout_marginEnd="15dp"
            android:autofillHints=""
            android:background="@color/layout_color"
            android:ems="10"
            android:fontFamily="@font/roboto_regular"
            android:hint="@string/enter_ur_task"
            android:inputType="textPersonName"
            android:textColor="@color/white"
            android:textColorHint="#5A5A5A"
            android:textSize="20sp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/tasktwo"
            tools:ignore="TextContrastCheck,TouchTargetSizeCheck" />

        <CheckBox
            android:id="@+id/checkBoxTwo"
            android:layout_width="30dp"
            android:layout_height="47dp"
            android:clickable="true"
            android:scaleX="1.1"
            android:scaleY="1.1"
            android:theme="@style/CheckBox"
            app:layout_constraintBottom_toBottomOf="@+id/tasktwo"
            app:layout_constraintEnd_toStartOf="@+id/tasktwo"
            app:layout_constraintTop_toTopOf="@+id/tasktwo"
            tools:ignore="TouchTargetSizeCheck" />

        <CheckBox
            android:id="@+id/checkBoxFour"
            android:layout_width="30dp"
            android:layout_height="47dp"
            android:clickable="true"
            android:scaleX="1.1"
            android:scaleY="1.1"
            android:theme="@style/CheckBox"
            app:layout_constraintBottom_toBottomOf="@+id/taskfour"
            app:layout_constraintEnd_toStartOf="@+id/taskfour"
            app:layout_constraintTop_toTopOf="@+id/taskfour"
            tools:ignore="TouchTargetSizeCheck" />

        <CheckBox
            android:id="@+id/checkBoxFive"
            android:layout_width="30dp"
            android:layout_height="47dp"
            android:clickable="true"
            android:scaleX="1.1"
            android:scaleY="1.1"
            android:theme="@style/CheckBox"
            app:layout_constraintBottom_toBottomOf="@+id/taskfive"
            app:layout_constraintEnd_toStartOf="@+id/taskfive"
            app:layout_constraintTop_toTopOf="@+id/taskfive"
            tools:ignore="TouchTargetSizeCheck" />

        <TextView
            android:id="@+id/todo_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="20dp"
            android:layout_marginTop="15dp"
            android:layout_marginEnd="56dp"
            android:fontFamily="@font/roboto_bold"
            android:text="@string/to_do"
            android:textColor="@color/white"
            android:textSize="20sp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/todo_dayint"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="3dp"
            android:fontFamily="@font/roboto_bold"
            android:textColor="@color/white"
            android:textSize="20sp"
            app:layout_constraintBottom_toBottomOf="@+id/todo_text"
            app:layout_constraintStart_toEndOf="@+id/todo_text"
            app:layout_constraintTop_toTopOf="@+id/todo_text" />

        <EditText
            android:id="@+id/taskone"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="60dp"
            android:layout_marginEnd="15dp"
            android:autofillHints=""
            android:background="@color/layout_color"
            android:ems="10"
            android:fontFamily="@font/roboto_regular"
            android:hint="@string/enter_ur_task"
            android:inputType="textPersonName"
            android:textColor="@color/white"
            android:textColorHint="#5A5A5A"
            android:textSize="20sp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            tools:ignore="TextContrastCheck,TouchTargetSizeCheck" />

        <EditText
            android:id="@+id/tasktwo"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:layout_marginEnd="15dp"
            android:autofillHints=""
            android:background="@color/layout_color"
            android:ems="10"
            android:fontFamily="@font/roboto_regular"
            android:hint="@string/enter_ur_task"
            android:inputType="textPersonName"
            android:textColor="@color/white"
            android:textColorHint="#5A5A5A"
            android:textSize="20sp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/taskone"
            tools:ignore="TextContrastCheck,TouchTargetSizeCheck" />

        <CheckBox
            android:id="@+id/checkBoxone"
            android:layout_width="30dp"
            android:layout_height="47dp"
            android:clickable="true"
            android:scaleX="1.1"
            android:scaleY="1.1"
            android:theme="@style/CheckBox"
            app:layout_constraintBottom_toBottomOf="@+id/taskone"
            app:layout_constraintEnd_toStartOf="@+id/taskone"
            app:layout_constraintTop_toTopOf="@+id/taskone"
            tools:ignore="TouchTargetSizeCheck" />

    </androidx.constraintlayout.widget.ConstraintLayout>


    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/calendar_layout"
        android:layout_width="300dp"
        android:layout_height="350dp"
        android:layout_marginStart="57dp"
        android:layout_marginEnd="57dp"
        android:layout_marginBottom="60dp"
        android:background="@drawable/shape"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.508"
        app:layout_constraintStart_toStartOf="parent">

        <CalendarView
            android:id="@+id/calendarView"
            android:layout_width="300dp"
            android:layout_height="310dp"
            android:layout_marginStart="32dp"
            android:layout_marginEnd="32dp"
            android:layout_marginBottom="10dp"
            android:focusedMonthDateColor="@color/calendar_color"
            android:unfocusedMonthDateColor="@color/white"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>

    <Button
        android:id="@+id/delete_tasks"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="62dp"
        android:layout_marginTop="39dp"
        android:layout_marginEnd="53dp"
        android:layout_marginBottom="39dp"
        android:backgroundTint="@color/delete_btn"
        android:text="Delete"
        app:layout_constraintBottom_toTopOf="@+id/calendar_layout"
        app:layout_constraintEnd_toStartOf="@+id/btn_save"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/todo_layout" />

    <Button
        android:id="@+id/btn_save"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="39dp"
        android:layout_marginEnd="62dp"
        android:layout_marginBottom="39dp"
        android:backgroundTint="@color/calendar_color"
        android:text="Save Tasks"
        app:layout_constraintBottom_toTopOf="@+id/calendar_layout"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/todo_layout" />


</androidx.constraintlayout.widget.ConstraintLayout>

Код MainActivity:


import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CalendarView;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.TextView;

import DataBase.MyDBManager;


public class MainActivity extends AppCompatActivity {

    public Button delete_tasks;
    public CheckBox cboxone, cboxtwo, cboxthree, cboxfour, cboxfive;
    public EditText tone, ttwo, tthree, tfour, tfive;
    public CalendarView calendar;
    public TextView dayint;
    public Button save_btn;

    private MyDBManager MyDBManager;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        java.text.DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext());

        delete_tasks = (Button) findViewById(R.id.delete_tasks);
        cboxone = (CheckBox) findViewById(R.id.checkBoxone);
        cboxtwo = (CheckBox) findViewById(R.id.checkBoxTwo);
        cboxthree = (CheckBox) findViewById(R.id.checkBoxThree);
        cboxfour = (CheckBox) findViewById(R.id.checkBoxFour);
        cboxfive = (CheckBox) findViewById(R.id.checkBoxFive);
        tone = (EditText) findViewById(R.id.taskone);
        ttwo = (EditText) findViewById(R.id.tasktwo);
        tthree = (EditText) findViewById(R.id.taskthree);
        tfour = (EditText) findViewById(R.id.taskfour);
        tfive = (EditText) findViewById(R.id.taskfive);
        calendar = (CalendarView) findViewById(R.id.calendarView);
        dayint = (TextView) findViewById(R.id.todo_dayint);
        save_btn = (Button) findViewById(R.id.btn_save);

        MyDBManager = new MyDBManager(this);


        calendar.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
            @Override
            public void onSelectedDayChange(@NonNull CalendarView calendarView, int i, int i1, int i2) {
                i1 = i1 + 1;
                String date = i2 + "." + i1;
                dayint.setText(date);
            }
        });

        delete_tasks.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(cboxone.isChecked()){
                    tone.setText("");
                    cboxone.setChecked(false);
                }
                if(cboxtwo.isChecked()){
                    ttwo.setText("");
                    cboxtwo.setChecked(false);
                }
                if(cboxthree.isChecked()){
                    tthree.setText("");
                    cboxthree.setChecked(false);
                }
                if(cboxfour.isChecked()){
                    tfour.setText("");
                    cboxfour.setChecked(false);
                }
                if(cboxfive.isChecked()){
                    tfive.setText("");
                    cboxfive.setChecked(false);
                }
            }
        });

        save_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(tone.length()>0){
                    MyDBManager.insertDB(tone.getText().toString().trim());
                }
            }
        });
    }



    @Override
    protected void onDestroy() {
        super.onDestroy();
        MyDBManager.closeDB();
    }

}

Код MyConstants:


public class MyConstants {
    public static final String TABLE_NAME = "my_table";
    public static final String ID = "id";
    public static final String TITLE = "title";
    public static final String DB_NAME = "my_db.db";
    public static final int DB_VERSION = 1;
    public static final String TABLE_STRUCT = "CREATE TABLE IF NOT EXIST "
            + TABLE_NAME + " (" + ID + " INTEGER PRIMARY KEY, " + TITLE + " TEXT)";

    public static final String DROP_TABLE = "DROP TABLE IF EXISTS " + TABLE_NAME;

}

Код MyDBHelper:


import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import androidx.annotation.Nullable;

public class MyDBHelper extends SQLiteOpenHelper {
    public MyDBHelper(@Nullable Context context) {
        super(context, MyConstants.DB_NAME, null, MyConstants.DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        db.execSQL(MyConstants.TABLE_STRUCT);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int i, int i1) {
        db.execSQL(MyConstants.DROP_TABLE);
        onCreate(db);
    }
}

Код MyDBManager:


import android.annotation.SuppressLint;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import java.util.ArrayList;
import java.util.List;

public class MyDBManager {
    public Context context;
    private MyDBHelper MyDBHelper;
    private SQLiteDatabase db;

    public MyDBManager(Context context) {
        this.context = context;
        MyDBHelper = new MyDBHelper(context);
    }

    public void openDB(){
        SQLiteDatabase db = MyDBHelper.getWritableDatabase();
    }

    public void insertDB(String title){

        ContentValues cv = new ContentValues();
        cv.put(MyConstants.TITLE, title);
        db.insert(MyConstants.TABLE_NAME, null, cv);

    }

    public List<String> getFromDB(){
        List<String> tempList = new ArrayList<>();
        Cursor cursor = db.query(MyConstants.TABLE_NAME, null, null, null, null, null,
        null);

        while (cursor.moveToNext()){
            @SuppressLint("Range") String title = cursor.getString(cursor.getColumnIndex(MyConstants.TITLE));
            tempList.add(title);
        }

        cursor.close();
        return tempList;
    }

    public void closeDB(){
        MyDBHelper.close();
    }

}

Debug:

    Process: com.example.taskmanager, PID: 30209
    java.lang.NullPointerException: Attempt to invoke virtual method 'long android.database.sqlite.SQLiteDatabase.insert(java.lang.String, java.lang.String, android.content.ContentValues)' on a null object reference
        at DataBase.MyDBManager.insertDB(MyDBManager.java:30)
        at com.example.taskmanager.MainActivity$3.onClick(MainActivity.java:92)
        at android.view.View.performClick(View.java:7509)
        at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119)
        at android.view.View.performClickInternal(View.java:7486)
        at android.view.View.access$3600(View.java:841)
        at android.view.View$PerformClick.run(View.java:28709)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:236)
        at android.app.ActivityThread.main(ActivityThread.java:8061)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967)

Ответы (0 шт):