Actualización de Android DB que no actualiza la versión DB después de una actualización exitosa

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

Pregunta

Estoy tratando de agregar tres nuevas tablas a mi SQLite DB existente y estoy con problemas con la versión de DB que no se actualiza después de una actualización exitosa. A continuación se muestra la base de datos que se ejecuta:

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());
    }       
}

a continuación es mi función abierta ():

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

A continuación se muestra mi función ():

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

Entonces, ¿qué sucede en la primera ejecución con una base de datos más alta, es el primer registro ONUPGRAED que se lee: Versión antigua 1 nueva versión 2 db.getVersion es 1

El segundo registro es: La versión después de ONUPGRADE es 2

Pero cuando se accede a la DB nuevamente después de que se haya actualizado el número de versión del DB no se actualiza y se ejecuta a través del OnUpgrade con el primer registro en la lectura ONUPGRAde: Versión antigua 1 nueva versión 2 db.getVersion es 1

Luego, la aplicación se bloqueó porque intenta crear una tabla que ya está allí.

He intentado no configurar manualmente la versión de DB en OnUpgrade también. Esto tampoco funcionó. También he intentado actualizar el número de versión ejecutando ...

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

... al final del Onupgrade.

Editar:

por sugerencia de Aswin Kumar He cambiado mi Onupgrade para hacer una copia de seguridad de mi mesa existente y dejar caer toda la tabla y luego recrearlos. Esto no ha arreglado el problema de mi versión. A continuación se muestra mi ONUPGRADE y 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);
    }   

A continuación se presentan las declaraciones SQLITE que uso para crear las tablas:

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)";

Cualquier ayuda sería genial apreciada.

Gracias, Kevin

¿Fue útil?

Solución 2

arreglado mi propio problema.El problema fue que había creado una clase de Helper DB separada que estaba accediendo al mismo DB que estaba tratando de actualizar.En esta clase de Helper DB separada, el número de versión se estableció en 1. Esta aplicación fue mi primer programa Java y Android y configuré las clases de DB horriblemente.He consolidado toda la clase DB a la que ahora estoy actualizando y ahora mi versión DB se está actualizando como debería.A continuación se muestran mis clases finales si alguien está interesado.

@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;
    }

Otros consejos

En onUpgrade(), debe generaracodicetagcodificar las tablas existentes (después de migrar los datos a algunos datos temporales), luego cree las nuevas tablas (usando los datos antiguos de DataStructure).Si no lo eres, las mesas antiguas todavía existirán.

Si esto no resuelve el problema, pegue los comandos exactos que está utilizando en drop

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top