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
, аргумент "неожиданно" был для меня настоящей работой. Теперь я не могу поверить, что это могло быть тяжело.