Я создаю приложение для Android, в котором используется вспомогательный класс БД и поставщик контента, используемый только для доступа к БД. Я заметил, что когда мое приложение запускается, оно никогда не попадает в onCreate () моего класса DBHelper, который имеет все DDL для созданий таблиц, если они не существуют.
Я вручную создал одну из таблиц и уже подтвердил, что могу выполнять операции CRUD через моего провайдера. Моя цель - предоставить поставщику контента доступ только к классу DBhelper, а пользовательский интерфейс должен использовать поставщика контента для операций CRUD.
Мне кажется, что мне не хватает части кресла, и я могу использовать некоторую помощь в понимании того, как этот процесс должен работать таким образом, чтобы при запуске моего приложения система проверяла, существуют ли таблицы, и создает, когда их нет.
Я реализовал свой класс DBhelper как синглтон, о котором, похоже, много спорят.
Я понимаю, что мне нужно получить читаемую или записываемую базу данных, прежде чем можно будет продолжить операции создания, по крайней мере, я думаю, что это правильно. Проблема, с которой я сталкиваюсь, заключается в том, что я не смог собрать воедино, если бы мне нужно было сделать это путем получения экземпляра моего класса db из onCreate моей MainActivity при запуске приложения? Или, если есть что-то, что я должен сделать в моем поставщике контента, который будет обрабатывать это при запуске приложения? К вашему сведению - мой провайдер контента зарегистрирован в моем манифесте, как уже упоминалось ранее, в моем MainActivity onCreate (), я успешно использовал провайдера контента для операций CRUD над таблицей, которую я строю вручную.
Любое направление здесь будет очень цениться.
Вот мой класс AppDB
class AppDatabase extends SQLiteOpenHelper{
public static final String DATABASE_NAME = "wgutrack.db";
public static final int DATABASE_VERSION = 1;
public static final String CTINE = "CREATE TABLE IF NOT EXISTS ";
public static final String PKA = " INTEGER PRIMARY KEY AUTOINCREMENT, ";
private static final String TEXT_TYPE = " TEXT";
public static final String INTEGER_TYPE = " INTEGER";
private static final String COMMA_SEP = ", ";
private static final String NN = " NOT NULL ";
// Implement AppDatabase as a singleton
private static AppDatabase instance = null;
private AppDatabase(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
/**
* Get an instance of the app's singleton db helper object
* @param context The content provider's context
* @return A SQLite DB helper object
*/
static AppDatabase getInstance(Context context) {
if (instance == null) {
instance = new AppDatabase(context);
}
return instance;
}
@Override
public void onCreate(SQLiteDatabase db) {
// Create script for Terms table
String sqlTerms;
sqlTerms = CTINE + TermsContract.TABLE_NAME + " ("
+ TermsContract.Columns._ID + PKA
+ TermsContract.Columns.COL_TITLE + TEXT_TYPE + NN + COMMA_SEP
+ TermsContract.Columns.COL_START + INTEGER_TYPE + NN + COMMA_SEP
+ TermsContract.Columns.COL_END + INTEGER_TYPE + NN + ")";
Log.d("SQLQRY", sqlTerms);
db.execSQL(sqlTerms);
// Create script for Courses table
String sqlCourses;
sqlCourses = CTINE + CoursesContract.TABLE_NAME + " ("
+ CoursesContract.Columns._ID + PKA
+ CoursesContract.Columns.COL_TITLE + TEXT_TYPE + NN + COMMA_SEP
+ CoursesContract.Columns.COL_STATUS + TEXT_TYPE + NN + COMMA_SEP
+ CoursesContract.Columns.COL_MENTOR_ID + INTEGER_TYPE + NN + COMMA_SEP
+ CoursesContract.Columns.COL_START + INTEGER_TYPE + COMMA_SEP
+ CoursesContract.Columns.COL_END + INTEGER_TYPE + COMMA_SEP
+ CoursesContract.Columns.COL_START_NOTIFY + INTEGER_TYPE + COMMA_SEP
+ CoursesContract.Columns.COL_END_NOTIFY + INTEGER_TYPE + ")";
Log.d("SQLQRY", sqlCourses);
db.execSQL(sqlCourses);
// Create script for term / course map table
String sqlMap;
sqlMap = CTINE + TermsCourseMapContract.TABLE_NAME + " ("
+ TermsCourseMapContract.Columns._ID + PKA
+ TermsCourseMapContract.Columns.COL_TERM_ID + INTEGER_TYPE + COMMA_SEP
+ TermsCourseMapContract.Columns.COL_COURSE_ID + INTEGER_TYPE + ")";
// Create script for Mentors table
String sqlMentors;
sqlMentors = CTINE + MentorsContract.TABLE_NAME + " ("
+ MentorsContract.Columns._ID + PKA
+ MentorsContract.Columns.COL_FIRST_NAME + TEXT_TYPE + NN + COMMA_SEP
+ MentorsContract.Columns.COL_LAST_NAME + TEXT_TYPE + NN + COMMA_SEP
+ MentorsContract.Columns.COL_PHONE + TEXT_TYPE + COMMA_SEP
+ MentorsContract.Columns.COL_EMAIL + TEXT_TYPE + ")";
Log.d("SQLQRY", sqlMentors);
db.execSQL(sqlMentors);
// Create script for Assessments table
String sqlAssessments;
sqlAssessments = CTINE + AssessmentsContract.TABLE_NAME + " ("
+ AssessmentsContract.Columns._ID + PKA
+ AssessmentsContract.Columns.COL_TITLE + TEXT_TYPE + NN + COMMA_SEP
+ AssessmentsContract.Columns.COL_DESC + TEXT_TYPE + COMMA_SEP
+ AssessmentsContract.Columns.COL_TYPE + TEXT_TYPE + COMMA_SEP
+ AssessmentsContract.Columns.COL_COURSE_ID + INTEGER_TYPE + NN + ")";
Log.d("SQLQRY", sqlAssessments);
db.execSQL(sqlAssessments);
// Create script for the Notes table
String sqlNotes;
sqlNotes = CTINE + NotesContract.TABLE_NAME + " ("
+ NotesContract.Columns._ID + PKA
+ NotesContract.Columns.COL_TITLE + TEXT_TYPE + NN + COMMA_SEP
+ NotesContract.Columns.COL_TEXT + TEXT_TYPE + NN + COMMA_SEP
+ NotesContract.Columns.COL_COURSE_ID + INTEGER_TYPE + NN + ")";
Log.d("SQLQRY", sqlNotes);
db.execSQL(sqlNotes);
// Create script for the Goals table
String sqlGoals;
sqlGoals = CTINE + GoalsContract.TABLE_NAME + " ("
+ GoalsContract.Columns._ID + PKA
+ GoalsContract.Columns.COL_TITLE + TEXT_TYPE + NN + COMMA_SEP
+ GoalsContract.Columns.COL_DESC + TEXT_TYPE + NN + COMMA_SEP
+ GoalsContract.Columns.COL_DUE_DATE + INTEGER_TYPE + NN + COMMA_SEP
+ GoalsContract.Columns.COL_ASS_ID + INTEGER_TYPE + NN + ")";
Log.d("SQLQRY", sqlGoals);
db.execSQL(sqlGoals);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch (oldVersion) {
case 1:
// upgrade from version 1
break;
default:
throw new IllegalStateException("onUpgrade() with unknown new version: " + newVersion);
}
}
}