зачем нам onUpgrade (); метод в классе SQLiteOpenHelper

Я следую этому руководству. http://www.androidhive.info/2011/11/android-sqlite-database-tutorial/

может кто-нибудь, пожалуйста, заставьте меня очистить этот кусок кода.

 // Creating Tables
@Override
public void onCreate(SQLiteDatabase db) {
    String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "("
            + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
            + KEY_PH_NO + " TEXT" + ")";
    db.execSQL(CREATE_CONTACTS_TABLE);
}

// Upgrading database
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // Drop older table if existed
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS);

    // Create tables again
    onCreate(db);
}

Вопросы

Какова цель onUpgrade(); метода?

Когда это называется? как говорится в документации this is Called when the database needs to be upgraded, что это значит под обновлением базы данных?

Важно

почему мы отбрасываем таблицу в этом методе и воссоздаем?

Заранее спасибо.


person Qadir Hussain    schedule 27.03.2013    source источник


Ответы (5)


onUpgrade в основном предназначен для обработки новых изменений базы данных (может быть добавление новых столбцов, добавление таблиц) для любой новой версии вашего приложения.

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

person Deva    schedule 27.03.2013
comment
хорошо, я кое-как прояснил. но когда это называется. если я добавлю новый столбец в существующую таблицу, будет ли это вызвано автоматически? - person Qadir Hussain; 27.03.2013
comment
Допустим, у вас есть приложение в Google Play с dbversion = 1, и теперь вы планируете выпустить новую версию своего приложения с дополнительной функцией, которая требует изменений в базе данных. так что вы измените свой dbversion = 2, и метод onUpgrade автоматически вызывается для пользователей, которые уже используют старую версию вашего приложения. Надеюсь, я здесь клер. - person Deva; 27.03.2013
comment
:) Да еще кое-как прояснил. также есть метод onDowngrade (). когда это называется? - person Qadir Hussain; 28.03.2013
comment
Это прямо противоположно тому, что делает onUpgrade, но да, строго говоря, вы обычно не игнорируете это. - person Deva; 28.03.2013

Обновление означает, что в схему базы данных были внесены изменения (номера версий разные), и ее необходимо обновить. Бросить стол и воссоздать его - один из способов сделать это. Вы также можете использовать операторы "alter table".

person Robby Pond    schedule 27.03.2013
comment
+1 за изменение проблемы в SQLite. Я хочу спросить еще одну вещь: onCreate () вызывается каждый раз, когда мы вызываем класс DBHelper.? если да, не перезапишет ли это мою существующую базу данных? - person Qadir Hussain; 28.03.2013
comment
Нет. Это вызывается только при первом создании базы данных. - person Robby Pond; 28.03.2013

Когда вы открываете свою базу данных, она проверяет номер версии и то, существует ли она. Вы можете просто «обновить» свою базу данных, а не создавать ее заново.

Хорошее руководство: http://www.vogella.com/articles/AndroidSQLite/article.html

person Bill Mote    schedule 27.03.2013
comment
что здесь произойдет, если я не уроню свою таблицу в методе onUpgrade? - person Qadir Hussain; 28.03.2013
comment
Это все зависит от вас. Просто помните, что вы не можете контролировать, как и когда пользователи обновляют. Некоторые будут переходить от 1 к 2 до 3 и т. Д. Другие начнутся с 2 или 3 и т. Д. Некоторые начнутся с 1 и никогда не обновятся;) (случается, поверьте мне.) А третьи пропустят версию (или 5) . Вот почему вам нужны методы создания и обновления. Убедитесь, что у вас есть путь. - person Bill Mote; 28.03.2013

Этот метод вызывается при обновлении версии вашей базы данных. Он удаляет существующие таблицы и создает их снова при повторном вызове метода onCreate.

person Twinkle Mishra    schedule 28.01.2015

Отвечая на ваши 4 вопроса:

1) Цель onUpgrade - управлять новой структурой базы данных. Вы можете запустить приложение с простыми функциями, тогда вам нужно, например, добавить новый столбец, поэтому вам нужно увеличить версию вашей базы данных с 1 до 2, а в onUpgrade дать инструкцию по добавлению нового столбца, чтобы, если пользователь обновляет приложение, добавляется новый столбец.

2) onUpgrade вызывается, когда у вас есть новая версия вашей базы данных и вы увеличили число int в методе super (здесь 1, поэтому вы в конечном итоге измените его на 2 )

 public static class DatabaseHelper extends SQLiteOpenHelper{
    DatabaseHelper(Context context){
        super (context,DATABASE_NAME,null,1);
    }

3). См. выше, что означает обновление базы данных.

4) Мы отбрасываем таблицу и воссоздаем, потому что для изменения таблицы (например, для добавления нового столбца, который соответствует новой функции) логический способ продолжения может быть, прежде чем "уничтожить" / DROP таблицу, а затем создать новую со всеми данными. Но это может быть не выход, хотя воссоздание данных может означать, что номера идентификаторов будут последовательными (обычно не последовательными: у вас могут быть 1, 2 и..4, потому что 3 было удалено), следовательно, отбрасывание, а затем снова создав таблицу и, в конечном итоге, загрузив предыдущие данные, вы можете добиться согласованности идентификаторов. Иногда вы можете захотеть использовать ALTER вместо DROP. Почему? Обычно из-за того, что при использовании DROP пользователь теряет контент, уже имеющийся в базе данных, тогда, если вы хотите узнать больше о передовых методах и более сложных сценариях реальной жизни, взгляните на этот удивительный ответить

person trocchietto    schedule 19.06.2016