2013-11-29 1 views
1

Недавно я узнал, как использовать SQLite3 на ОС Android. Но у него есть неприемлемая часть.Почему SQLiteOpenHelper удаляет таблицу в методе «onUpgrade»?

Я не могу понять, почему вы отбрасываете таблицу при вызове метода onUpgrade для SQLiteOpenHelper. Зачем нужен метод «onUpgarde»?

Если код выполняет «drop table», данные таблицы старой версии DB будут удалены, не так ли?

Зачем удалять существующие данные старой БД?

Как восстановить существующие данные БД при удалении таблицы?


[Здесь познается код]

public class MySQLiteOpenHelper extends SQLiteOpenHelper { 

    final String CONFIRMED_SHEETS_TABLE = "confirmed_sheets"; 

    public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { 
     super(context, name, factory, version); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase sqLiteDatabase) { 
     String sql = "create table" + 
       CONFIRMED_SHEETS_TABLE + 
       "_id integer primary key autoincrement, " + 
       "group text, " + 
       "num001 text, " + 
       "num002 text, " + 
       "num003 text, " + 
       "num004 text, " + 
       "num005 text, " + 
       "num006 text, " + 
       "date text)"; 
     sqLiteDatabase.execSQL(sql); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) { 

     // non acceptable part // 
     String sql = "drop table if exists " + CONFIRMED_SHEETS_TABLE; 
     sqLiteDatabase.execSQL(sql); 

     onCreate(sqLiteDatabase); 
    } 
} 
+0

Команда 'drop table' вызывается * вашим * кодом, а не системой. Вы можете взять это и сделать миграционную логику. –

+0

Знаете ли вы, почему изученный код выполняет «drop table»? –

+0

Мне интересно в этой части. –

ответ

5

Если код выполняется «удалить таблицу», DB таблицы данных старой версии БД будет удален , не так ли?

Йуп

Почему нужен метод "onUpgrade"?

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

Знаете ли вы, почему узнал, что код выполняет «drop table»?

Удобство. Это не обязательно правильный подход, но изменение базы данных может затруднить получение старых данных и объединение их в новую таблицу. Таким образом, проще логично просто начать заново.

Если вы хотите объединить существующие и новые таблицы, взгляните на this question.

+0

Может ли метод «onUpgrage» вызывать много раз во время выполнения? –

+0

Да. Когда вы создаете новый объект SQLiteHelper, проверяется версия базы данных и при необходимости вызывается 'onUpgrade()'. –

+0

Спасибо за ваш ответ.: D –

1

OnUpgrade() вызывается, когда db versions "старый и новый" не соответствует; что означает, что пользователь хочет изменить структуру базы данных (удаление таблицы, добавление новой таблицы, изменение определения таблицы).

Так OnUpgrade() должен содержать логику как:

  1. взять резервную копию существующих данных (например, Генерировать операторы вставки для существующих данных).
  2. Соответственно измените структуру базы данных.
  3. Восстановить данные из резервной копии.
+0

Спасибо за ваш ответ. –

2

Вам не нужно выполнять ТАБЛИЦУ DROP в onUpgrade(), так как он в настоящее время написан в вашем коде. Цель onUpgrade() - это ваше приложение, чтобы проверить, установлена ​​ли новая версия базы данных вашего приложения на устройстве пользователя, и если да, если в вашей базе данных есть какие-либо изменения, например добавление нового столбца, вы можете сделать эти изменяется в пределах onUpgrade(). Если вы никогда не меняете схему базы данных, вам никогда не нужно ничего делать в onUpgrade().

Дополнительную информацию и вводное руководство по Базы данных в Android см. В примере кода Notepad here.

EDIT: Кроме того, вот пример onUpgrade() я написал для одного из моих приложений:

/** 
    * Handle upgrades to the database. 
    */ 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     if(DBG) Utils.log(TAG, "DBHelper: onUpgrade()..."); 

     // Logs that the database is being upgraded 
     Utils.log(TAG, "w", "Upgrading database from version " + oldVersion + " to " 
       + newVersion); 

     /* 
     * Every time you add new columns to the database in the phone, you will want 
     * to increment the Database version above and then add a condition in here for 
     * upgrading to it. Otherwise it will cause upgrading users to be nontrivial and 
     * lead to unnecessary crashes or upgrade instructions. 
     */ 
     if (newVersion > oldVersion && newVersion <= 4) { 
      db.execSQL("ALTER TABLE " + TrackerDb.SomeTable.TABLE_NAME + " ADD COLUMN " 
        + TrackerDb.SomeTable.COLUMN_NAME_DATE_MODIFIED + " TEXT"); 
     } 
    } 
+0

Спасибо за подробное объяснение. : D –

+0

Это хороший код, который поможет мне понять. –

+0

Спасибо. Пожалуйста, поддержите мой комментарий, если это поможет. – anddev84

Смежные вопросы