2016-09-21 2 views
1

Я немного смущен о onUpgrade. Я разрабатываю свое приложение, и в процессе разработки я изменил DATABASE_VERSION пять раз, так что теперь это 6.onUpgrade() при недавно установленном приложении

Все прошло гладко до тех пор, пока я полностью не удалил приложение с моего телефона и не построил его снова. С тех пор я получаю ошибки, что ни одна из моих таблиц, которые я прошу, существует ...

Я думаю, что теперь, когда мой DATABASE_VERSION в проекте установлен на 6, а недавно установленное приложение получает его на 6 на start, onUpgrade() не вызывается.

Вопрос в том, как предоставить все мои запросы, заданные в методе onUpgrade для новых установок?

Я знаю, что onUpgrade() называется тем, что называется getWritableDatabase(). Но мое приложение падает на этой полосе:

Cursor spinner_cursor = db.rawQuery("SELECT value1 AS _id, value2 FROM tab2", null); 

Что предшествует полоса:

SQLiteDatabase db = new DBHelper(this).getWritableDatabase(); 

я получаю эту ошибку в LogCat:

no such table: car (code 1): , while compiling: SELECT value1 AS _id, value2 FROM tab2 

мой DBHelper.class выглядит

public class DBHelper extends SQLiteOpenHelper { 

private static final String DATABASE_NAME = "DataBase1"; 
private static final int DATABASE_VERSION = 6; 
private static final String CREATE_QUERY = 
     "CREATE TABLE tab1 (id, value1, value2, etc)"; 

private static final String QUERY_2 = 
     "CREATE TABLE tab2 (id, value1, value2, etc)"; 

private static final String QUERY_3 = 
     "CREATE TABLE tab3 (id, value1, value2, etc)"; 

private static final String QUERY_4 = 
     "ALTER TABLE tab2 ADD COLUMN value3 VARCHAR(10) NULL"; 

private static final String QUERY_5 = 
     "ALTER TABLE tab2 ADD COLUMN value4 VARCHAR(10) NULL"; 

private static final String QUERY_6 = 
     "ALTER TABLE tab2 ADD COLUMN value5 VARCHAR(10) NULL"; 

private static final String QUERY_7 = 
     "ALTER TABLE tab3 ADD COLUMN value3 VARCHAR(10) NULL"; 

private static final String QUERY_8 = 
     "ALTER TABLE tab3 ADD COLUMN value4 VARCHAR(10) NULL"; 

private static final String QUERY_9 = 
     "ALTER TABLE tab3 ADD COLUMN value5 VARCHAR(10) NULL"; 

private static final String QUERY_10 = 
     "ALTER TABLE tab3 ADD COLUMN value6 VARCHAR(10) NULL"; 

private static final String QUERY_11 = 
     "ALTER TABLE tab3 ADD COLUMN value7 VARCHAR(10) NULL"; 

private static final String QUERY_12 = 
     "DROP TABLE tab3"; 

private static final String QUERY_13 = 
     "CREATE TABLE tab3 (id, value1, value2, etc)"; 


public DBHelper(Context context){ 

    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    Log.e("DATABASE OPERATIONS", "Database created/opened"); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 

    db.execSQL(CREATE_QUERY); 
} 

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

    if (oldVersion < 3) { 
     db.execSQL(QUERY_2); 
     db.execSQL(QUERY_3); 
     db.execSQL(QUERY_4); 
     db.execSQL(QUERY_5); 
     db.execSQL(QUERY_6); 
    } 

    if (oldVersion < 4) { 
     db.execSQL(QUERY_7); 
     db.execSQL(QUERY_8); 
     db.execSQL(QUERY_9); 
     db.execSQL(QUERY_10); 
    } 

    if (oldVersion < 5){ 
     db.execSQL(QUERY_11); 
    } 

    if (oldVersion < 6){ 
     db.execSQL(QUERY_12); 
     db.execSQL(QUERY_13); 
    } 

Заранее благодарен!

+0

Вы уже отпустили свое приложение? Если нет, то весь этот материал обновления не нужен. –

+0

В 'onCreate()' вы должны создать все необходимые таблицы, а именно. 'tab2',' tab3' –

+0

. Дело в том, что я удалил приложение, а затем сгенерировал apk и неадаптированное приложение. Это когда проблемы начинаются. Вы говорите, что я должен избавиться от всех этих изменений и воссоздать запросы и поместить все это в один и все в onCreate? Как это работает после выхода приложения? – relliz

ответ

2
@Override 
public void onCreate(SQLiteDatabase db) { 

    db.execSQL(CREATE_QUERY); 
    db.execSQL(QUERY_2); 
    db.execSQL(QUERY_3); 
    db.execSQL(QUERY_4); 
    db.execSQL(QUERY_5); 
    db.execSQL(QUERY_6); 
    db.execSQL(QUERY_7); 
    db.execSQL(QUERY_8); 
    db.execSQL(QUERY_9); 
    db.execSQL(QUERY_10); 
    db.execSQL(QUERY_11); 
    db.execSQL(QUERY_12); 
    db.execSQL(QUERY_13); 

} 

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

    if (oldVersion < 3) { 
     db.execSQL(QUERY_2); 
     db.execSQL(QUERY_3); 
     db.execSQL(QUERY_4); 
     db.execSQL(QUERY_5); 
     db.execSQL(QUERY_6); 
    } 

    if (oldVersion < 4) { 
     db.execSQL(QUERY_7); 
     db.execSQL(QUERY_8); 
     db.execSQL(QUERY_9); 
     db.execSQL(QUERY_10); 
    } 

    if (oldVersion < 5){ 
     db.execSQL(QUERY_11); 
    } 

    if (oldVersion < 6){ 
     db.execSQL(QUERY_12); 
     db.execSQL(QUERY_13); 
    } 
+0

Хорошо, я понимаю, зачем ставить все запросы в методе onCreate, но тогда почему ' onUpgrade 'даже нужно? Та же проблема будет, если я выпущу свое приложение и сделаю какие-либо изменения в структуре db. Поправьте меня если я ошибаюсь. Я просто не понимаю, как это работает после выпуска. Боюсь, что у людей будут такие же аварии, как у меня сейчас. – relliz

+0

Существует два сценария 1. База данных еще не была инициализирована. В этом случае метод onCreate() называется 2. База данных существует на устройстве с версией x, но вы установили новую версию приложения с обновленной базой данных с версией y, где y> x. В этом случае вызывается onUpgrade() – HomeIsWhereThePcIs

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