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)