La base de données de mise à niveau Android ne met pas à jour la version de la base de données après une mise à niveau réussie

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

Question

J'essaie d'ajouter trois nouvelles tables à ma base de données SQLite existante et je rencontre des problèmes avec la version de la base de données qui ne se met pas à jour après une mise à niveau réussie.Vous trouverez ci-dessous le DatabaseHelper qui s'exécute :

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

Ci-dessous ma fonction open() :

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

Ci-dessous ma fonction close() :

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

Ainsi, ce qui se passe lors de la première exécution avec une DATABASE_VERSION plus élevée est la première lecture du journal onUpgrade :Ancienne version 1 Nouvelle version 2 db.getVersion est 1

Le deuxième journal est :La version après onUpgrade est 2

Mais ensuite, lorsque l'on accède à nouveau à la base de données après l'exécution de onUpgrade, le numéro de version de la base de données n'est pas mis à jour et il s'exécute via onUpgrade avec le premier journal dans la lecture onUpgrade :Ancienne version 1 Nouvelle version 2 db.getVersion est 1

Ensuite, l'application s'est écrasée car elle tentait de créer une table déjà présente.

J'ai également essayé de ne pas définir manuellement la version de base de données dans onUpgrade.Cela n'a pas fonctionné non plus.J'ai également essayé de mettre à jour le numéro de version en exécutant...

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

...à la fin de onUpgrade.

MODIFIER:

Selon la suggestion d'Aswin Kumar, j'ai modifié mon onUpgrade pour sauvegarder ma table existante, supprimer toutes les tables, puis les recréer.Cela n'a pas résolu mon problème de version.Ci-dessous se trouvent mes onUpgrade et 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);
    }   

Vous trouverez ci-dessous les instructions SQLite que j'utilise pour créer les tables :

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

Toute aide serait grandement appréciée.

Merci, Kevin

Était-ce utile?

La solution 2

Correction de mon propre problème.La question était que j'avais créé une classe d'assistance distincte de la DB qui accédait à la même dB qui était essayait de mettre à niveau.Dans cette classe Helper DB distincte, le numéro de version a été défini sur 1. Cette application était mon premier programme Java et Android et je configurais les classes de DB horriblement.J'ai consolidé toute la classe DB à celle que je vis à la mise à niveau et que la version de la base de données est maintenant mise à jour comme si elle devrait.Vous trouverez ci-dessous mes classes finales si quelqu'un est intéressé.

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

Autres conseils

Dans onUpgrade(), Vous devez drop les tables existantes (après avoir migré les données vers une structure de données temporaire), puis créez les nouvelles tables (en utilisant les anciennes données de la structure de données).Si ce n’est pas le cas, les anciennes tables existeront toujours.

Si cela ne résout pas le problème, collez les commandes exactes que vous utilisez dans db.execSQL()

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top