SQLiteOpenHelper - как создается база данных?

Я делаю приложение базы данных, и моя программа работает, и я понял большую часть учебника, за которым я слежу. Однако один аспект остается мне неясным.

Существует внутренний класс MyDBHelper, расширяющий SQLiteOpenHelper. Внешние переменные включают SQLiteDatabase, называемую d. Код для MyDBHelper:

private static class MyDBHelper extends SQLiteOpenHelper {
        MyDBHelper(Context c) {
            super(c, DB_NAME, null, DB_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            try {
                db.execSQL(DATABASE_CREATE);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVers, int newVers) {
            Log.w(TAG, "Upgrading database from version " + oldVers + " to " + newVers + ", which will destroy all old data.");
            db.execSQL("DROP TABLE IF EXISTS GM");
            onCreate(db);
        }
    }

Мой вопрос в том, как это на самом деле создает исходную базу данных. Это происходит в методе onCreate(), но, насколько я вижу, это никогда. Я понимаю, что он вызывается, когда база данных создается впервые, но где? И, кроме того, как это передать SQLiteDatabase db? Я не передал какую-либо базу данных методу. И как моя переменная SQLiteDatabase db из внешнего класса установлена ​​в созданную базу данных? Может ли кто-нибудь рассказать мне об этом, как идиот?

Ответ 1

onCreate() и onUpgrade() методы действительно называются в первый раз, когда создается Db. Фактически, он проверял методы getReadableDatabase() or getWritebleDatabase() SQLiteOpenHelper. Он проверит, существует ли база данных уже в каталоге данных и какая версия. В соответствии с этим он либо выберет onCreate(), or onUpgrade(). Или ничего, если файл db существует и имеет правильную версию.

Вы можете выполнить поиск кода для выполнения myDBHelper.getReadable(Writable)Database(). Это время, когда эта проверка будет выполнена.

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация. Удачи.

Ответ 2

Имейте в виду, что вы расширяете SQLiteOpenHelper, все волшебство происходит в этом суперклассе, в частности, база данных изначально создается (или просто повторно открывается), когда вы вызываете либо getReadableDatabase(), либо getWritableDatabase(). Эти два метода:

  • Определите переменную SQLiteDatabase db (и управляйте передачей db методам обратного вызова)
  • Инициализировать db путем вызова метода onCreate(db) или открытия существующей базы данных
  • Проверьте номер версии и при необходимости вызовите onUpgrade(db) или onDowngrade(db)

Они также называют еще несколько методов обратного вызова, таких как onConfigure(db), onOpen(db) и т.д. (Подробнее об этих методах.) Если это поможет, вы можете прочитать исходный код самостоятельно, чтобы понять структуру того, как и когда все это происходит.

Ответ 3

Метод onCreate() не является конструктором для этого класса. onCreate вызывается при создании БД.

Здесь PeopleDB расширяет SQLiteOpenHelper. Этот код относится к другому классу, а onCreate вызывается, когда getWritableDatabase() или getReadableDatabase(), или что-либо из этого вида называется

  PeopleDB db = null; //onCreate NOT called here
  db=new PeopleDB(getContext());
  db.getWritableDatabase();  //onCreate is called here!

Надеюсь, что это поможет.

Ответ 4

См. нашу базу данных создается в самом конструкторе openhelper не в переопределенном методе onCreate. Внутри метода onCreate мы запускаем запрос для создания таблицы в базе данных, которая создается в конструкторе открытых помощников, чтобы вставить данные, не создающие базу данных.

Еще одна вещь - объект SQLiteDatabase не создается в классе SQLiteOpenHelper. Он создается в классе, в котором вы хотите использовать базу данных для выполнения операций с db, и вам нужно написать такую ​​функцию, чтобы выполнить инициализацию или открыть базу данных, чтобы подготовиться к вставке.

SQLiteDatabase database;

YourOpenHelper yourOpenHelper=new YourOpenHelper(); //to creating database using openhelper and automatically call onCreate to make a table in that

    public void open() throws SQLException {
            database = profiloHelper.getWritableDatabase();
        }

Вот код, который вы должны написать для любой операции в базе данных, такой как удаление вставки, просто нужно изменить QUERY

SQLiteStatement insert_stmt = null;

        try {
            insert_stmt = database.compileStatement(YOUR_QUERY);

            insert_stmt.bindString(1,   field1);
            insert_stmt.bindString(2,   field2);
            insert_stmt.executeInsert();
        }
        finally {
            if (insert_stmt != null) insert_stmt.close();
        }

Ответ 5

Возможно, в getReadableDatabase() или getWriteableDatabase(), когда они вызываются в первый раз


Ответ 6

Вы создаете подкласс, реализующий onCreate (SQLiteDatabase), onUpgrade (SQLiteDatabase, int, int) и необязательно onOpen (SQLiteDatabase), и этот класс заботится о том, чтобы открыть базу данных, если она существует, создавая ее, если это не так, и обновление при необходимости. (Веб-сайт разработчика Android)

Ответ 7

Класс SQLiteOpenHelper называется "помощником" по уважительной причине. Это экономит нам писателей приложений значительные усилия.

В первом getWritableDatabase (или getReadableDatabase) для вашей реализации SQLiteOpenHelper оператор super в вашем конструкторе передает текущие Context и базу данных NAME, который вы предпочитаете конструктору суперкласса для SQLiteOpenHelper.

Конструктор суперкласса затем устанавливает начальное пространство для вашего SQLiteDatabase и присваивает ему имя, которое вы прошли через super.

По завершении конструктор суперкласса вызывает onCreate и передает имя SQLiteDatabase, которое оно создало с помощью параметра onCreate only. Поскольку onCreate вызван только один раз, это очень хорошее место для вызова execSQL для определения структуры вашей базы данных.

Последующие исполнения getReadableDatabase (или getWritableDatabase) просто открывают вам базу данных и больше никогда не вызовут onCreate. (Когда конструктор суперкласса отмечает, что super отправил другой номер версии, onUpgrade является calle.)

Понимание того, как SQLiteOpenHelper создает базу данных без очевидного кода и как передается хеп onCreate, аргумент "неожиданно" был для меня настоящей работой. Теперь я не могу поверить, что это могло быть тяжело.