Проблема обновления базы данных sqlite для Android - PullRequest
1 голос
/ 02 февраля 2012

У меня небольшая проблема с обновлением базы данных sqlite.Сейчас я использую это:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    Log.w("","UPGRADE DATABASE : "+" oldVErsion : "+oldVersion+" newVersion : "+newVersion);
    switch(newVersion){
    case 2:
        Log.w("","UPGRADE DATABASE : "+newVersion);
        db.execSQL("ALTER TABLE collection_lang ADD COLUMN bonus_text VARCHAR(200)");
        db.execSQL("ALTER TABLE collection_lang ADD COLUMN quantity integer");
    case 3:
        Log.w("","UPGRADE DATABASE : "+newVersion);
        db.execSQL("ALTER TABLE users ADD COLUMN firstName varchar(70)");
        db.execSQL("ALTER TABLE users ADD COLUMN lastName varchar(70)");
        db.execSQL("ALTER TABLE users ADD COLUMN user varchar(70)");
    }
}

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

Мне нужно найти способ запуска запросов с самого начала .. если моя последняя версия базы данных - 5, я хочу сначала запустить случай 2, чем случай 3, чем 4и в последнем случае 5. Так что мне не нужно будет писать все запросы с самого начала, потому что это приведет к сбою для старых пользователей.

Есть идеи, как этого добиться?

Ответы [ 4 ]

2 голосов
/ 02 февраля 2012

Как насчет использования цикла?

       //or start = oldVersion;              
 for (int start = 2 , start<=newVersion ; start++){
      switch(start){
    case 2:
        Log.w("","UPGRADE DATABASE : "+newVersion);
        db.execSQL("ALTER TABLE collection_lang ADD COLUMN bonus_text VARCHAR(200)");
        db.execSQL("ALTER TABLE collection_lang ADD COLUMN quantity integer");
        break;
    case 3:
        Log.w("","UPGRADE DATABASE : "+newVersion);
        db.execSQL("ALTER TABLE users ADD COLUMN firstName varchar(70)");
        db.execSQL("ALTER TABLE users ADD COLUMN lastName varchar(70)");
        db.execSQL("ALTER TABLE users ADD COLUMN user varchar(70)");
        break;
    default:
        break;
    }

Но это не нормальный способ.Как будто пользователь уже добавил некоторые изменения.И вы снова запустите это изменение, тогда оно создаст исключение.

2 голосов
/ 02 февраля 2012

Просто добавьте ваши запросы из случая 2 в случай 3 и добавьте оператор break после каждого случая.Так что в вашем случае это будет что-то вроде этого:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    Log.w("","UPGRADE DATABASE : "+" oldVErsion : "+oldVersion+" newVersion : "+newVersion);
    switch(newVersion){
    case 2:
        Log.w("","UPGRADE DATABASE : "+newVersion);
        db.execSQL("ALTER TABLE collection_lang ADD COLUMN bonus_text VARCHAR(200)");
        db.execSQL("ALTER TABLE collection_lang ADD COLUMN quantity integer");
        break;
    case 3:
        Log.w("","UPGRADE DATABASE : "+newVersion);
        db.execSQL("ALTER TABLE collection_lang ADD COLUMN bonus_text VARCHAR(200)");
        db.execSQL("ALTER TABLE collection_lang ADD COLUMN quantity integer");
        db.execSQL("ALTER TABLE users ADD COLUMN firstName varchar(70)");
        db.execSQL("ALTER TABLE users ADD COLUMN lastName varchar(70)");
        db.execSQL("ALTER TABLE users ADD COLUMN user varchar(70)");
        break;
    }
}

Обновление: Сделайте что-то вроде этого:

switch(newVersion){
case 2:
    Log.w("","UPGRADE DATABASE : "+newVersion);
    db.execSQL("ALTER TABLE collection_lang ADD COLUMN bonus_text VARCHAR(200)");
    db.execSQL("ALTER TABLE collection_lang ADD COLUMN quantity integer");
    break;
case 3:
    Log.w("","UPGRADE DATABASE : "+newVersion);
    switch(oldVersion) {
        case 1:
            db.execSQL("ALTER TABLE collection_lang ADD COLUMN bonus_text VARCHAR(200)");
            db.execSQL("ALTER TABLE collection_lang ADD COLUMN quantity integer");
            db.execSQL("ALTER TABLE users ADD COLUMN firstName varchar(70)");
            db.execSQL("ALTER TABLE users ADD COLUMN lastName varchar(70)");
            db.execSQL("ALTER TABLE users ADD COLUMN user varchar(70)");
            break;
        case 2: 
            db.execSQL("ALTER TABLE users ADD COLUMN firstName varchar(70)");
            db.execSQL("ALTER TABLE users ADD COLUMN lastName varchar(70)");
            db.execSQL("ALTER TABLE users ADD COLUMN user varchar(70)");
            break;
    }

}
1 голос
/ 02 марта 2013

Вместо того, чтобы вкладывать кучу переключателей, это будет довольно быстро. Я бы предложил этот подход, который будет охватывать все сценарии. Он обновит вашу существующую базу данных (независимо от версии) до текущей поэтапно: (как обсуждено здесь )

int curVer = oldVersion;
while ( curVer < newVersion ) {
    curVer++;
    switch ( curVer ) {
        case 2: {
            // Upgrade from V1 to V2
            break;
        }
        case 3: {
            // Upgrade from V2 to V3
            break;
        }
        case 4: {
            // Upgrade from V3 to V4
            break;
        }
    }
}
0 голосов
/ 12 февраля 2015

Простой, просто поместите ваши условия в обратном порядке и не используйте пример break

в нижеследующем условии, если значение i равно 3, вы получите 3,2,1, если его 4, то 4,3,2, 1

switch(i){ case 4: System.out.println("4"); case 3: System.out.println("3"); case 2: System.out.println("2"); case 1: System.out.println("1"); }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...