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 из внешний класс установлен в созданную базу данных? Может ли кто-нибудь поговорить со мной как с идиотом?

7 ответов


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

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

пожалуйста, дайте мне знать, если больше нужны подробности. Удачи!--7-->


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

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

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


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

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

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

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


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

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

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();
        }

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

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();
        }

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



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


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

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

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

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

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

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