Создавать таблицы через контент-провайдера или напрямую обращаться к DBHelper? Другой? - PullRequest
0 голосов
/ 06 мая 2018

Я создаю приложение для 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);
        }
    }
}

1 Ответ

0 голосов
/ 06 мая 2018

Я заметил, что когда мое приложение запускается, оно никогда не onCreate () моего класса DBHelper, который имеет все DDL для таблицы творения, если они не существуют.

Метод onCreate класса SQLIteOpenHelper запускается один раз при создании базы данных. Он не запускается каждый раз, когда создается экземпляр подкласса.

При разработке приложения самым простым способом изменения структуры базы данных является одно из следующих действий (при условии, что данные могут быть потеряны): -

  • Удалить / очистить данные приложения из настроек на устройстве и перезапустить приложение.
  • Удалите и переустановите приложение, а затем снова запустите приложение.
  • использует подходящий код в методе onUpgrade, который удаляет таблицы и затем вызывает измененный метод onCreate.

Если вам нужно сохранить данные, то вы можете использовать метод onUpgrade для изменения таблиц в пределах ограничений ALTER TABLE .

Вы можете проверить, существует ли таблица, запросив таблицу sqlite_master . Это возвращает курсор с 5 столбцами, а именно: -

  • Тип
    • стол для столов
  • имя название организации
  • tbl_name имя таблицы, к которой относится объект.
  • rootpage
  • sql SQL, использованный для создания сущности

  • (сущность относится к типу, например, таблица, индекс, представление, триггер)

.... при запуске моего приложения система проверит наличие таблиц и создать, когда они не существуют.

Итак, чтобы проверить tablex, вы можете использовать

SELECT tbl_name FROM sqlite_master WHERE tbl_name = 'tablex' AND type = 'table';

Таким образом, у вас может быть метод что-то вроде следующего: -

public boolean doesTableExist(String table_name) {
    boolean rv = false;
    String[] columns = new String[]{"sqlite_master"};
    String whereclause = "tbl_name=? AND type=?";
    String[] whereargs = new String[]{table_name,"table"};
    Cursor csr = yoursqlitedatabase.query("sqlite_master",columns,whereclause,wwhereargs,null,null,null);
    rv = csr.getCount() > 0;
    csr.close();
    return rv;
}
  • Если вы включите вышеупомянутое в DBhelper, тогда Cursor csr = yoursqlitedatabase.query("sqlite_master",columns,whereclause,wwhereargs,null,null,null); может быть Cursor csr = this.getWritableDatabase().query("sqlite_master",columns,whereclause,wwhereargs,null,null,null);

    • Часто вы увидите SQliteDatabase db = this.getWritabledatabase(), а затем db.query........

    • тогда вы можете иметь что-то вроде AppDatabase myDBHlper; в качестве переменной класса, а затем myDBHelper = Appdatabase.getInstance(this), за которым следует if (myDBHelper.doestableExist("your_table")) { ....... } в классе (деятельности), где вы хотите проверить.

Конечно, достаточно просто использовать CREATE TABLE IF NOT EXISTS .......

Вы можете реализовать проверки и т. Д., Переопределив метод onOpen класса, который является подклассом SQLiteOpenHelper (он же DBHelper) или метод onConfigure.

...