Не инициализируется вспомогательный класс наследующий SQLiteOpenHelper
Не инициализируется вспомогательный класс наследующий SQLiteOpenHelper, от чего выдает NullPointerException. Код БД
public class DB {
private static final String DB_NAME = "taskDB";
private static final int DB_VERSION = 1;
private static final String TABLE_STUDY_TASK = "studyTable";
private static final String KEY_ID = "_id";
public static final String KEY_SUBJECT_NAME = "subName";
public static final String KEY_OBJECTIVE_NAME = "objName";
public static final String KEY_TIME_OF_TASK = "taskTime";
public static final String KEY_TASK_IMAGE = "taskImg";
private static final String CREATE_TABLE_STUDY =
"create table if not exists " + TABLE_STUDY_TASK + "(" + KEY_ID + " integer primary key autoincrement, " + KEY_SUBJECT_NAME + " text, " + KEY_OBJECTIVE_NAME + " text, " +
KEY_TASK_IMAGE + " integer, " + KEY_TIME_OF_TASK + " numeric" + ");";
private final Context mCtx;
private DBHelper mDBHelper;
private SQLiteDatabase mDB;
public DB(Context Ctx) {
mCtx = Ctx;
}
public void open(){
mDBHelper = new DBHelper(mCtx, DB_NAME, null, DB_VERSION);
mDB = mDBHelper.getWritableDatabase();
}
public void close(){
if(mDBHelper != null) mDBHelper.close();
}
public Cursor getTaskStudyData(){
return mDB.query(TABLE_STUDY_TASK, null, null, null, null, null, null);
}
public void addRecToStudyTable(String subject_name, String objective_name, int image, String time ){
ContentValues cv = new ContentValues();
cv.put(KEY_SUBJECT_NAME, subject_name);
cv.put(KEY_OBJECTIVE_NAME, objective_name);
cv.put(KEY_TASK_IMAGE, image);
cv.put(KEY_TIME_OF_TASK, time);
mDB.insert(TABLE_STUDY_TASK, null, cv);
}
public void delRecStudyTable(long id){
mDB.delete(TABLE_STUDY_TASK, KEY_ID + " = " + id, null);
}
private class DBHelper extends SQLiteOpenHelper {
public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory,
int version) {
super(context, name, factory, version);
}
// создаем и заполняем БД
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_TABLE_STUDY);
ContentValues cv = new ContentValues();
for(int i = 0; i<5; i++){
cv.put(KEY_SUBJECT_NAME, "someSubject" + i);
cv.put(KEY_OBJECTIVE_NAME, "someObj" + i);
cv.put(KEY_TASK_IMAGE, R.drawable.ic_launcher_background);
cv.put(KEY_TIME_OF_TASK, "11:00");
mDB.insert(TABLE_STUDY_TASK, null, cv);
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
}
Лог ошибки
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.checklist, PID: 17046
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 com.example.checklist.DB$DBHelper.onCreate(DB.java:82)
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:393)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:298)
at com.example.checklist.DB.open(DB.java:38)
at com.example.checklist.FirstTypeTaskFragment.onCreateView(FirstTypeTaskFragment.java:56)
at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2698)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:310)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1185)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1354)
at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1432)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1495)
at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:447)
at androidx.fragment.app.FragmentManager.executeOps(FragmentManager.java:2167)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1990)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1945)
at androidx.fragment.app.FragmentManager.execSingleAction(FragmentManager.java:1816)
at androidx.fragment.app.BackStackRecord.commitNow(BackStackRecord.java:297)
at com.example.checklist.CreateTaskActivity$1.onItemSelected(CreateTaskActivity.java:53)
at android.widget.AdapterView.fireOnSelected(AdapterView.java:1366)
at android.widget.AdapterView.dispatchOnItemSelected(AdapterView.java:1355)
at android.widget.AdapterView.access$300(AdapterView.java:59)
at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:1314)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7078)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:974)
В чём заключается проблема?
Ответы (1 шт):
Автор решения: ЮрийСПб
→ Ссылка
Разные классы лучше определять в разных файлах. Вы этого не сделали и получили ошибку, связанную с опечаткой.
У вас во внутреннем классе DBHelper в методе onCreate используется переменная mDB, которая находится во внешнем классе, где она null, на момент обращения
mDB.insert(TABLE_STUDY_TASK, null, cv);
Просто замените mDB на db.