0

I am new on Android Studio and is currently creating a simple program to make a schedule list and save it into the SQLite Database. When I run the program and attempt to save the data into the database, the app keeps on crashing. How can I solve this problem?

These are my codes:

Main Fragment:

public class NewSchedulerFragment extends Fragment {

SchedulerDbHelper taskDb = new SchedulerDbHelper(getActivity());



public NewSchedulerFragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_new_scheduler, container, false);
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    Button btnSetTime = getView().findViewById(R.id.btnSetTime);
    Button btnSetDate = getView().findViewById(R.id.btnSetDate);
    Button btnConfirmAddTask = getView().findViewById(R.id.btnConfirmAddTask);
    TextView textViewTime = getView().findViewById(R.id.textViewTime);
    TextView textViewDate = getView().findViewById(R.id.textViewDate);
    textViewDate.setText("No date set.");
    textViewTime.setText("No time set.");
    final Task task = new Task();

    btnSetTime.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Calendar c = Calendar.getInstance();
            int hour = c.get(Calendar.HOUR_OF_DAY);
            int minute = c.get(Calendar.MINUTE);

            TimePickerDialog timePickerDialog = new TimePickerDialog(getActivity(), new TimePickerDialog.OnTimeSetListener() {
                @Override
                public void onTimeSet(TimePicker timePicker, int i, int i1) {
                    TextView textViewTime = getView().findViewById(R.id.textViewTime);
                    textViewTime.setText(i + ":" + i1);
                    task.setHour(i);
                    task.setMinute(i1);
                }
            },
                    hour, minute, false);
            timePickerDialog.show();
        }
    });

    btnSetDate.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Calendar c = Calendar.getInstance();
            int day = c.get(Calendar.DAY_OF_MONTH);
            int month = c.get(Calendar.MONTH);
            int year = c.get(Calendar.YEAR);

            DatePickerDialog datePickerDialog = new DatePickerDialog(getActivity(), new DatePickerDialog.OnDateSetListener() {
                @Override
                public void onDateSet(DatePicker datePicker, int i, int i1, int i2) {
                    TextView textViewDate = getView().findViewById(R.id.textViewDate);
                    textViewDate.setText(i2 + "/" + (i1+1) + "/" + i);
                    task.setYear(i2);
                    task.setMonth((i1+1));
                    task.setDay(i);
                }
            }, day, month, year);
            datePickerDialog.show();
        }
    });

    btnConfirmAddTask.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            EditText editTextTaskName = getView().findViewById(R.id.editTextTaskName);
            task.setTaskName(editTextTaskName.getText().toString());
            taskDb.addTask(task);
            SchedulerFragment schedulerFragment = new SchedulerFragment();
            FragmentManager manager = getFragmentManager();
            manager.beginTransaction().replace(R.id.frameLayoutContent, schedulerFragment, schedulerFragment.getTag()).commit();
        }
    });
}

}

Database Class:

public class SchedulerDbHelper extends SQLiteOpenHelper {

public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "scheduler.db";
public static final String TABLE_NAME = "SCHEDULER_TABLE";
public static final String TASK_NAME = "NAME";
public static final String TASK_YEAR = "YEAR";
public static final String TASK_MONTH = "MONTH";
public static final String TASK_DAY = "DAY";
public static final String TASK_HOUR = "HOUR";
public static final String TASK_MINUTE = "MINUTE";

public SchedulerDbHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
    String query = "CREATE TABLE " + TABLE_NAME + "(" + TASK_NAME + "TEXT PRIMARY KEY, " +
            TASK_YEAR + "INTEGER, " + TASK_MONTH + "INTEGER, " + TASK_DAY + "INTEGER, " +
            TASK_HOUR + "INTEGER, " + TASK_MINUTE + "INTEGER" + ")";
    sqLiteDatabase.execSQL(query);
}

@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
    String query = "DROP TABLE IF EXISTS " + TABLE_NAME;
    sqLiteDatabase.execSQL(query);
    onCreate(sqLiteDatabase);
}

public void addTask(Task task) {
    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues values = new ContentValues();

    values.put(TASK_NAME, task.getTaskName());
    values.put(TASK_YEAR, task.getYear());
    values.put(TASK_MONTH, task.getMonth());
    values.put(TASK_DAY, task.getDay());
    values.put(TASK_HOUR, task.getHour());
    values.put(TASK_MINUTE, task.getMinute());

    db.insert(TABLE_NAME, null, values);
    db.close();
}

}

Exception that I get:

 --------- beginning of crash

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.android.eduhub, PID: 2388 java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler)' on a null object reference at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:223) at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163) at com.example.android.eduhub.SchedulerDbHelper.addTask(SchedulerDbHelper.java:44) at com.example.android.eduhub.NewSchedulerFragment$3.onClick(NewSchedulerFragment.java:108) at android.view.View.performClick(View.java:5610) at android.view.View$PerformClick.run(View.java:22265) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)

  • please add full stack of Exception which you get. – Gunavant Patel Jun 15 '18 at 18:27
  • I have added the exception in the post. – Tan Tze Hong Jun 15 '18 at 19:24
  • 1
    Change `SchedulerDbHelper taskDb = new SchedulerDbHelper(getActivity());` to `SchedulerDbHelper taskDb;` and add line in `onCreateView` method `taskDb = new SchedulerDbHelper(getActivity());` – MikeT Jun 15 '18 at 19:27
  • That totally solved my problem. Thanks a lot! But can I know why is this solving my problem? – Tan Tze Hong Jun 16 '18 at 10:00
  • `getActivity()` returns non-null only after the fragment is attached to an activity. Instantiation is too early, `onCreateView()` is called after attaching. – laalto Jun 16 '18 at 11:11
  • Also: `SQLiteOpenHelper` uses the `Context` given to it relatively late, only when actually opening the database, as in `getWritableDatabase()`. – laalto Jun 16 '18 at 11:12

0 Answers0