2014-02-01 2 views
0

У меня есть 2 класса: TableA и TableB, соответствующие таблицам SQLite в первой версии моего приложения.
Теперь я готов выпустить следующую версию, где мне нужно добавить другую таблицу, TableC.Проблема с обновлением SQLite

В каждом классе у меня есть метод onCreate(SQLiteDatabase sqlDatabase) и onUpgrade(SQLiteDatabase sqlDatabase, int oldVersion, int newVersion).

Вот что я хочу сделать: сохранить TABLEA, как это,
добавить новый столбец в TableB
и, конечно же, создать новый TableC.

Я обновил мою версию базы данных номер в SQLiteOpenHelper я мои методы реализованы, как показано ниже:

TableA.onUpgrade(/*parameters*/){ 
    //Nothing to do here 
} 

TableB.onUpgrade(/*parameters*/){ 
    sqlDatabase.execSQL("ALTER TABLE TableB ADD COLUMN columnFoo INTEGER DEFAULT 1"); 
} 

TableC.onUpgrade(/*parameters*/){ 
    sqlDatabase.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); 
    onCreate(sqlDatabase); //calls sqlDatabase.execSQL(CREATE_TableC); 
} 

Моя реализация SQLiteOpenHelper подкласс выглядит, как показано ниже:

 @Override 
public void onCreate(SQLiteDatabase sqlDatabase) { 
    TableA.onCreate(sqlDatabase); 
    TableB.onCreate(sqlDatabase); 
      TableC.onCreate(sqlDatabase); 
} 

    @Override 
    public void onUpgrade(SQLiteDatabase sqlDatabase, int oldVersion, int newVersion)   
     { 
    TableA.onUpgrade(sqlDatabase); 
    TableB.onUpgrade(sqlDatabase); 
      TableC.onUpgrade(sqlDatabase); 
    } 

Моя проблема что у меня проблемы с этим.
Когда я установил новую версию своего приложения на новую виртуальную машину Genymotion Android, у меня появилась ошибка в запросе, который я делаю в своем запуске на TableB, заявив, что новый столбец не существует.

Я тестировал обновление на существующей виртуальной машине Genymotion Android, на которой была установлена ​​1-я версия моего приложения.
Там он работал нормально.

Я, конечно, могу продолжать создавать новые виртуальные машины для каждого запуска и устанавливать свое приложение для тестирования.
Но я хотел спросить, что я могу делать неправильно, и что было бы хорошим способом проверить.
Как правильно обрабатывать базу данных для моих существующих пользователей и как мне создать новую базу данных/таблицы для моих новых пользователей?
Любая помощь приветствуется!

Мое приложение поддерживает Android API 14 (ICS) и выше.

+0

Когда вы вызываете свой метод onUpgrade, поскольку он звучит как в вашем сообщении, вы вызываете его _allways_. –

+0

Я предполагаю, что SQLLiteOpenHelper 'onUpdate()' вызывается всякий раз, когда номер версии базы данных, определенный в этом классе, увеличивается. – rgamber

+0

Извинения, я проверил код для SQLLiteOpenHelper и он управляет onUpdate() для вас. Какой уровень API на Android вы тестируете, и вы удаляете приложение и переустанавливаете для тестирования версии 1 на версию 2. –

ответ

1

Проблема происходит, когда устройство # 1 есть приложение дб версия позволяет говорить 2, устройство # 2 есть приложение дб версии 5, и новый релиз имеет DB версии 6.

Тогда в идеале: устройство 1 должно начать обновление с 2 -> 3-> 4-> 5-> 6. устройство 2: 5-> 6.

Таким образом, старый код обновления остается неизменным, и вы продолжаете добавлять новый код обновления для новой версии.

Вот пример (один из способов обработки onUpgrade()):

@Override 
    public void onUpgrade(SQLiteDatabase sqlDatabase, int oldVersion, int newVersion) { 
    try { 
      if (oldVersion < 51) { 
       upgradeToVersion51(db); // From 50 or 51 
       oldVersion = 51; 
      } 
      if (oldVersion == 51) { 
       upgradeToVersion52(db); 
       oldVersion += 1; 
      } 
      if (oldVersion == 52) { 
       upgradeToVersion53(db); 
       oldVersion += 1; 
      } 

     } catch (SQLiteException e) { 
      Log.e(TAG, "onUpgrade: SQLiteException, recreating db. ", e); 
      Log.e(TAG, "(oldVersion was " + oldVersion + ")"); 
      return; // this was lossy 
     }  
    } 

Примечание: Вы должны врезаться статическим окончательный Int DATABASE_VERSION; всякий раз, когда вы обновляете, проверьте эту ссылку, например.

Проверить, как Календарь ручка DB обновления здесь: http://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android-apps/4.0.1_r1/com/android/providers/calendar/CalendarDatabaseHelper.java/?v=source

Надеется, что это помогает!

+0

Спасибо за объяснение :). Я узнал, что один из моих запросов sql имел ',' missing! Реализация отлично работает! – rgamber

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