O banco de dados de atualização do Android não atualiza a versão do banco de dados após a atualização bem-sucedida

StackOverflow https://stackoverflow.com//questions/11687473

Pergunta

Estou tentando adicionar três novas tabelas ao meu banco de dados sqlite existente e estou tendo problemas com a versão do banco de dados que não é atualizada após uma atualização bem-sucedida.Abaixo está o DatabaseHelper que é executado:

private static class DatabaseHelper extends SQLiteOpenHelper {

    public DatabaseHelper(Context context, String name, CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        Log.w(TAG, "Current db version is " + db.getVersion());
        db.execSQL(ORIGINAL_DATABASE_CREATE);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.w(TAG, "Old Version " + oldVersion + " New Version " + newVersion + " db.getVersion is " + db.getVersion());
        db.execSQL(NEW_TABLE_1_DATABASE_CREATE);
        db.execSQL(NEW_TABLE_2_DATABASE_CREATE);
        db.execSQL(NEW_TABLE_3_DATABASE_CREATE);
        db.setVersion(newVersion);
        Log.w(TAG, "Version after onUpgrade is " + db.getVersion());
    }       
}

Abaixo está minha função open():

public VehicleExpDbAdapter open() throws SQLException {
    mDbHelper = new DatabaseHelper(mCtx, DATABASE_NAME, null, DATABASE_VERSION);
    mDb = mDbHelper.getWritableDatabase();
    return this;
}

Abaixo está minha função close():

public void close() {
    mDb.close();
    mDbHelper.close();
}

Então, o que acontece na primeira execução com um DATABASE_VERSION mais alto é a primeira leitura do onUpgrade Log:Versão Antiga 1 Nova Versão 2 db.getVersion é 1

O segundo registro é:A versão após onUpgrade é 2

Mas então, quando o banco de dados é acessado novamente após a execução do onUpgrade, o número da versão do banco de dados não é atualizado e é executado através do onUpgrade com o primeiro log na leitura do onUpgrade:Versão Antiga 1 Nova Versão 2 db.getVersion é 1

Então o aplicativo travou porque tenta criar uma tabela que já existe.

Também tentei não definir manualmente a versão do banco de dados no onUpgrade.Isso também não funcionou.Também tentei atualizar o número da versão executando ...

db.execSQL("PRAGMA user_version = " + newVersion);

...no final do onUpgrade.

EDITAR:

Por sugestão de Aswin Kumar, mudei meu onUpgrade para fazer backup de minha tabela existente, eliminar todas as tabelas e recriá-las.Isso não resolveu meu problema de versão.Abaixo está meu onUpgrade e onCreate:

@Override
    public void onCreate(SQLiteDatabase db) {
        Log.w(TAG, "Current db version is " + db.getVersion());

        db.execSQL(ORIGINAL_DATABASE_CREATE);

        db.execSQL(NEW_TABLE_1_DATABASE_CREATE);
        db.execSQL(NEW_TABLE_2_DATABASE_CREATE);
        db.execSQL(NEW_TABLE_3_DATABASE_CREATE);

    }

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

        Log.w(TAG, "Old Version " + oldVersion + " New Version " + newVersion + " db.getVersion is " + db.getVersion());

        mOldDbContents = backupTables(db);

        db.execSQL("DROP TABLE IF EXISTS " + ORIGINAL_DATABASE_CREATE);
        db.execSQL("DROP TABLE IF EXISTS " + NEW_TABLE_1_DATABASE_CREATE);
        db.execSQL("DROP TABLE IF EXISTS " + NEW_TABLE_2_DATABASE_CREATE);
        db.execSQL("DROP TABLE IF EXISTS " + NEW_TABLE_3_DATABASE_CREATE);

        onCreate(db);
    }   

Abaixo estão as instruções sqlite que uso para criar as tabelas:

private static final String ORIGINAL_DATABASE_CREATE = "create table " + VEHICLE_EXPENSE_TABLE_NAME + 
        " (" + KEY_ROW_ID + " integer primary key autoincrement, " + 
        KEY_UNIX_DATE + " integer, " + 
        KEY_DATE + " not null default current_date, " +
        KEY_TIME + " not null default current_time, " + 
        KEY_DESCRIPTION + " text, " + 
        KEY_START_MILE + " integer, " + 
        KEY_END_MILE + " integer, " + 
        KEY_MILES + " text, " + 
        KEY_AMOUNT + " text, " 
        + KEY_PARTY_ID + " integer)";

private static final String NEW_TABLE_1_DATABASE_CREATE = "CREATE TABLE " + PURCHASE_HISTORY_TABLE_NAME + 
        "(" + HISTORY_ORDER_ID_COL + " TEXT PRIMARY KEY, " +
        HISTORY_STATE_COL + " INTEGER, " + 
        HISTORY_PRODUCT_ID_COL + " TEXT, " + 
        HISTORY_DEVELOPER_PAYLOAD_COL + " TEXT, " + 
        HISTORY_PURCHASE_TIME_COL + " INTEGER)";

private static final String NEW_TABLE_2_DATABASE_CREATE = "CREATE TABLE " + PURCHASED_ITEMS_TABLE_NAME + 
        "(" + PURCHASED_PRODUCT_ID_COL + " TEXT PRIMARY KEY, " + 
        PURCHASED_QUANTITY_COL + " INTEGER)";

private static final String NEW_TABLE_3_DATABASE_CREATE = "CREATE TABLE " + TRIAL_LIMIT_TABLE_NAME + 
        "(" + TRIAL_PRODUCT_ID_COL + " TEXT PRIMARY KEY, " + 
        TRIAL_PRODUCT_NAME + " TEXT, " + 
        TRIAL_START_DATE + " INTEGER)";

Qualquer ajuda seria muito apreciada.

Obrigado Kevin

Foi útil?

Solução 2

Resolvi meu próprio problema.O problema é que eu criei uma classe auxiliar de banco de dados separada que acessava o mesmo banco de dados que estava tentando atualizar.Nesta classe auxiliar de banco de dados separada, o número da versão foi definido como 1.Este aplicativo foi meu primeiro programa Java e Android e eu configurei as classes de banco de dados de maneira horrível.Consolidei toda a classe do banco de dados para aquela que estou atualizando agora e agora minha versão do banco de dados está sendo atualizada como deveria.Abaixo estão minhas aulas finais se alguém estiver interessado.

@Override
    public void onCreate(SQLiteDatabase db) {
        Log.w(TAG, "Current db version is " + db.getVersion());

        db.execSQL(VEHICLE_EXPENSE_DATABASE_CREATE);

        db.execSQL(PURCHASE_HISTORY_DATABASE_CREATE);
        db.execSQL(PURCHASE_ITEMS_DATABASE_CREATE);
        db.execSQL(TRIAL_TIME_DATABASE_CREATE);
    }


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

        Log.w(TAG, "Old Version " + oldVersion + " New Version " + newVersion + " db.getVersion is " + db.getVersion());

        if (oldVersion < newVersion) {

            if (oldVersion == 1) {
                db = upgradeTo2(db);
            }
        }
    }

private SQLiteDatabase upgradeTo2(SQLiteDatabase db) {

        db.beginTransaction();
        try {
            db.execSQL(PURCHASE_HISTORY_DATABASE_CREATE);
            db.execSQL(PURCHASE_ITEMS_DATABASE_CREATE);
            db.execSQL(TRIAL_TIME_DATABASE_CREATE);
            db.setTransactionSuccessful();
        } catch (Exception e) {
            Log.w(TAG, "onUpgrade failed");
        } finally {
            db.endTransaction();
        }

        return db;
    }

Outras dicas

Em onUpgrade(), Você tem que drop as tabelas existentes (após migrar os dados para alguma estrutura de dados temporária) e, em seguida, crie as novas tabelas (usando os dados antigos da estrutura de dados).Caso contrário, as tabelas antigas ainda existirão.

Se isso não resolver o problema, cole os comandos exatos que você está usando no db.execSQL()

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top