Domanda

Sto cercando di aggiungere tre nuove tabelle al mio db sqlite esistente e sto riscontrando problemi con la versione db che non si aggiorna dopo un aggiornamento riuscito.Di seguito è riportato il DatabaseHelper che viene eseguito:

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

Di seguito è riportata la funzione open() :

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

Di seguito è riportata la mia funzione close() :

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

Quindi quello che succede alla prima esecuzione con un DATABASE_VERSION più alto è il primo log onUpgrade letto:Vecchia versione 1 Nuova versione 2 db.getVersion è 1

Il secondo Registro è:La versione dopo onUpgrade è 2

Ma poi quando si accede nuovamente al db dopo l'esecuzione di onUpgrade il numero di versione del DB non viene aggiornato e viene eseguito attraverso onUpgrade con il primo registro nella lettura di onUpgrade:Vecchia versione 1 Nuova versione 2 db.getVersion è 1

Quindi l'app si è bloccata perché prova a creare una tabella che è già lì.

Ho provato a non impostare manualmente anche la versione db in onUpgrade.Neanche questo ha funzionato.Ho anche provato ad aggiornare il numero di versione eseguendo...

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

... alla fine dell'onUpgrade.

MODIFICARE:

Per il suggerimento di Aswin Kumar ho cambiato il mio onUpgrade per eseguire il backup del mio tavolo esistente e far cadere tutto il tavolo e quindi ricrearli.Questo non ha risolto il mio problema di versione.Di seguito è riportato il mio 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);
    }   

Di seguito sono riportate le istruzioni sqlite che utilizzo per creare le tabelle:

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

Qualsiasi aiuto sarebbe molto apprezzato.

Ringraziamento, Kevin

È stato utile?

Soluzione 2

Risolto il mio problema.Il problema era che avevo creato una classe di helper DB separata che stava accedendo allo stesso DB che stava cercando di aggiornare.In questa classe di helper DB separata il numero di versione è stato impostato su 1. Questa app è stata il mio primo programma Java e Android e confinando le classi DB orribilmente.Ho consolidato tutta la classe DB a quella che ora sto aggiornando e ora la mia versione DB sta aggiornando come se dovrebbe.Di seguito sono riportate le mie classi finali se qualcuno è interessato.

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

Altri suggerimenti

In onUpgrade(), Devi drop le tabelle esistenti (dopo aver migrato i dati in una struttura dati temporanea), quindi creare le nuove tabelle (utilizzando i vecchi dati di datastructure).Se non lo sei, i vecchi tavoli esisteranno ancora.

Se questo non risolve il problema, incollare i comandi esatti che si sta utilizzando in db.execSQL()

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top