2015-02-05 3 views
1

Каким образом можно выполнить метод onUpgrade SQLiteOpenHelper, когда у нас есть 4 версии базы данных, и мы добавили новое поле в таблицу пользователя в каждой версии?SQLite onUpgrade с 4 версиями базы данных

Вариант A: // Нет «перерыв» после каждого случая, он продолжает работать для случаев 2 и 3?

public void onUpgrade(SQLiteDatabase database, int version_old, int current_version) { 
    switch (version_old) { 
    case 1: 
     database.execSQL(addPostcodeFieldToUserTable); 
    case 2: 
     database.execSQL(addGenderFieldToUserTable); 
    case 3: 
     database.execSQL(addEmailSubscriptionFieldToUserTable); 
     break; 
    } 
} 

Вариант B:

public void onUpgrade(SQLiteDatabase database, int version_old, int current_version) { 
    switch (version_old) { 
    case 1: 
     database.execSQL(addPostcodeFieldToUserTable); 
     break; 
    case 2: 
     database.execSQL(addPostcodeFieldToUserTable); 
     database.execSQL(addGenderFieldToUserTable); 
     break; 
    case 3: 
     database.execSQL(addPostcodeFieldToUserTable); 
     database.execSQL(addGenderFieldToUserTable); 
     database.execSQL(addEmailSubscriptionFieldToUserTable); 
     break; 
    } 

Но что мы делаем в случае, когда пользователь имел версии 1 БД, затем пропустил версии 2 и модернизировал приложение с 3-й версии?

Вариант 3:

public void onUpgrade(SQLiteDatabase database, int version_old, int current_version) { 
    if(version_old==1 && current_version==2) { 
     database.execSQL(addPostcodeFieldToUserTable); 

    } else if(version_old==2 && current_version==3) { 
     database.execSQL(addGenderFieldToUserTable); 

    } else if(version_old==3 && current_version==4) { 
     database.execSQL(addEmailSubscriptionFieldToUserTable); 

    } else if(version_old==1 && current_version==3) { 
     database.execSQL(addPostcodeFieldToUserTable); 
     database.execSQL(addGenderFieldToUserTable); 

    } else if(version_old==1 && current_version==4) { 
     database.execSQL(addPostcodeFieldToUserTable); 
     database.execSQL(addGenderFieldToUserTable); 
     database.execSQL(addEmailSubscriptionFieldToUserTable); 

    } else if(version_old==2 && current_version==4) { 
     database.execSQL(addGenderFieldToUserTable); 
     database.execSQL(addEmailSubscriptionFieldToUserTable); 

    } 
} 
+0

Я бы сказал, что ** B **: если 'пользователь имел версию 1 из БД, затем пропустил версии 2 и модернизированных приложение с версией 3', тогда он/она получит ** все ** обновления в любом случае. Даже ненужные предыдущие (которые, я надеюсь, ** удалось изящно терпеть неудачу **, если таблицы/s уже находятся в db). –

+0

Что делать, если бы я использовал версию метода onUpgrade для 3-х версий сейчас, будет ли она что-то нарушать для существующих пользователей при загрузке новейших версий приложения, где я использую вариант B? –

+0

Также вы можете подробно остановиться на вещи «удалось изящно терпеть неудачу» –

ответ

2

Нет «ломать» после каждого случая, он продолжает работать для случаев 2 и 3?

Да. Обычной практикой является добавление комментария, как

// fallthrough 

указать недостающее break является намеренным.

Но что мы будем делать в случае, если у пользователя была версия 1 БД, а затем пропущена версия 2 и обновлено приложение с версией 3?

onUprade() будет называться с oldVersion 1 и newVersion 3. Код должен обновить базу данных до версии 3 схемы.

Какой вариант использовать, зависит от того, какой из них наиболее удобен для вас. Я бы лично пошел с чем-то вроде варианта А, так как он имеет наименьший код.

+0

Это облегчение, потому что я использовал вариант А для первых трех версий :) –

3

Что вы могли бы также сделать, это сделать onUpgrade рекурсивный вызов,

public void onUpgrade(SQLiteDatabase database, int version_old, int current_version) { 
switch (version_old) { 
case 1: 
    database.execSQL(addPostcodeFieldToUserTable); 
    onUpgrade(database,version_old++,current_version); 
    break; 
case 2: 
    database.execSQL(addPostcodeFieldToUserTable); 
    database.execSQL(addGenderFieldToUserTable); 
    onUpgrade(database,version_old++,current_version) 
    break; 
default: 
    break; 
} 

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

+0

«Надо сделать» довольно сильно сказано. Нет необходимости. – laalto

+0

это лучше? – Ajay

+0

Да, это может сработать, и к личным предпочтениям подходит какой подход. – laalto

1

Использование switch без break s неточно.

Общий шаблон должен использовать ряд if с вместо:

if (version_old < 2) { 
    database.execSQL(addPostcodeFieldToUserTable); 
} 
if (version_old < 3) { 
    database.execSQL(addGenderFieldToUserTable); 
} 
if (version_old < 4) { 
    database.execSQL(addEmailSubscriptionFieldToUserTable); 
} 
Смежные вопросы