2014-04-15 2 views
0
private static final String TABLE_MAIN_CREATE = "CREATE TABLE IF NOT EXISTS " + TABLE_MAIN_NAME + " (a INTEGER, b LONG, c TEXT, d TEXT, e DATETIME, f TEXT)"; 
private static final String TABLE_MAIN_UPGRADE = "ALTER TABLE " + TABLE_MAIN_NAME + " ADD Column f TEXT"; 

    @Override 
public void onCreate(SQLiteDatabase db) { 
    db.execSQL(TABLE_MAIN_CREATE); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    if (oldVersion < newVersion) { 
     db.execSQL(TABLE_MAIN_UPGRADE); 
    } 
    onCreate(db); 
} 

Предыдущая версия db была без поля «f». Это правильный способ обновления БД? Нужно ли мне onCreate (db) в onUpgrade?Каков правильный способ обновления sqllite db?

Я сделал это несколько раз, и каждый раз, когда я получил еще одно исключения: 1) таблицы уже существует, так что я добавил «IF NOT EXISTS» 2) не мог читать строки 0, Col 5 ошибки здесь я потерял его ... .

Это правильный способ обновления БД?

Я хочу, чтобы мои данные

+2

удалить и переустановить приложение – Raghunandan

+1

перейдите по этой ссылке http://stackoverflow.com/a/14236970/942224 –

+0

Я хочу сохранить свои данные, кроме того, когда пользователи переустанавливают приложение в Google Play, оно снижает рейтинг поиска –

ответ

-11

Внимание: Это хороший и рабочий раствор, но есть много людей, которые downvote этот ответ, потому что у них есть что-то личное or because they don't know java's basics(case from 10 to 12 are without break;)

Вы должны сделать что-то зависит от oldVersion.

FX: вы можете иметь DB версии 10-14, в старше 10 вы не WANA поддержку и в каждой новой версии вы добавить новый столбец, должны производиться код выглядит (newVersion 14):

private static final String TABLE_MAIN_CREATE_14 = 
    "CREATE TABLE IF NOT EXISTS " + TABLE_MAIN_NAME + 
    " (a INTEGER, b LONG, c TEXT, d TEXT, e DATETIME, f TEXT, g TEXT, h TEXT, i TEXT)"; 
private static final String TABLE_MAIN_UPGRADE_10_11 = 
    "ALTER TABLE " + TABLE_MAIN_NAME + " ADD Column f TEXT"; 
private static final String TABLE_MAIN_UPGRADE_11_12 = 
    "ALTER TABLE " + TABLE_MAIN_NAME + " ADD Column g TEXT"; 
private static final String TABLE_MAIN_UPGRADE_12_13 = 
    "ALTER TABLE " + TABLE_MAIN_NAME + " ADD Column h TEXT"; 
private static final String TABLE_MAIN_UPGRADE_13_14 = 
    "ALTER TABLE " + TABLE_MAIN_NAME + " ADD Column i TEXT"; 
    @Override 
public void onCreate(SQLiteDatabase db) { 
    db.execSQL(TABLE_MAIN_CREATE_14); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    switch(oldVersion){ 
      case 10: // from 10 to 11 and go to next case 
       db.execSQL(TABLE_MAIN_UPGRADE_10_11); 
      case 11: // from 11 to 12 and go to next case 
       db.execSQL(TABLE_MAIN_UPGRADE_11_12); 
      case 12: // from 12 to 13 and go to next case 
       db.execSQL(TABLE_MAIN_UPGRADE_12_13); 
      case 13: // from 13 to newVersion 
       db.execSQL(TABLE_MAIN_UPGRADE_13_14); 
       break; 
      default: 
       //not upgratable too old - so we should drop and recreate; 
       db.execSQL("DROP TABLE IF EXISTS " + TABLE_MAIN_NAME ); 
       onCreate(db); 
       break; 
    } 
} 
+0

я не вижу ни одного момента нисходящего голоса без какого-либо разумного комментария –

+0

Thnx, но я вижу точку ... sSometimes я могу быть действительно анонимным (иронические комментарии и т. д.) :) И единственный способ, ну, мне нужно dow nvote вопрос :) – Selvin

0

Нет, вам не нужно вызывать onCreate в onUpgrade, вы можете удалить onCreate(db); из этого метода.

0

Вам не нужно называтьСоздавать в onUpgrade. Выполнение db.execSQL (TABLE_MAIN_UPGRADE) достаточно для обновления. Теперь вы должны очистить данные своего приложения. Для того, чтобы сделать это повторно установить приложение или выполнить в андроиде оболочке

pm clear your.app.package 
0

Один из способов вы можете сделать внутри onUpgrade метода удалить таблицу и создать заново. Таким образом, будут удалены только данные для этой конкретной таблицы, а не все данные БД.

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
{ 
    Log.w("TAG", "Upgrading database from version " + oldVersion + " to " + newVersion); 
    switch (oldVersion) 
    { 
     case 1: 
       db.execSQL("DROP TABLE IF EXISTS " + TABLE_MAIN_NAME); 
       db.execSQL(TABLE_MAIN_CREATE); 
     default: 
      break; 
    } 
} 
0

В Android Documentation:

Этот метод вызывается после того, как соединение с базой данных была настроена и после того, как схема базы данных была создана, обновлена ​​или понижены в случае необходимости.

onCreate (db); не требуется для обновления базы данных.

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