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