Ho creato correttamente un database SQLite e funziona correttamente. Tuttavia, quando viene chiamato il metodo onUpgrade, mi piacerebbe farlo senza perdere dati. L'app che sto sviluppando è un'app di quiz. Semplicemente, quando viene chiamato il metodo onCreate, creo e prepopolo un database con domande, risposte, ecc. L'ultima colonna indica se hanno impostato la domanda come preferita o meno. Quello che vorrei fare è che quando viene chiamato il metodo onUpgrade, vorrei salvare temporaneamente una colonna, eliminare l'intero database, ricrearlo con tutte le modifiche apportate alle vecchie domande e aggiungere eventuali nuove domande, quindi -adottare le domande che hanno impostato come preferiti.Aggiornamento SQLite Android senza perdita di dati
Quindi una possibilità che ho provato era il seguente:
db.execSQL("ALTER TABLE quiz RENAME TO temp_quiz");
onCreate(db);
db.execSQL("INSERT INTO quiz (favouries) SELECT favourites FROM temp_quiz");
db.execSQL("DROP TABLE IF EXISTS temp_quiz");
Tuttavia questo non funziona a causa del fatto INSERT INTO solo aggiunge nuove righe invece di sostituire le righe esistenti. Ho anche provato REPLACE INTO, INSERT O REPLACE INTO e
db.execSQL("INSERT INTO quiz (_id, favouries) SELECT _id, favourites FROM temp_quiz");
di cui nessuno funziona.
Attualmente sono impostato per funzionare modificando il nome della tabella, chiamando il metodo onCreate (db) e quindi impostando un cursore che legge ciascuna riga e utilizza il metodo db.update() come mostrato di seguito :
int place = 1;
int TOTAL_NUMBER_OF_ROWS = 500;
while (place < TOTAL_NUMBER_OF_ROWS) {
String[] columns = new String[] { "_id", ..........., "FAVOURITES" };
// not included all the middle columns
Cursor c = db.query("temp_quiz", columns, "_id=" + place, null, null, null, null);
c.moveToFirst();
String s = c.getString(10);
// gets the value from the FAVOURITES column
ContentValues values = new ContentValues();
values.put(KEY_FLAG, s);
String where = KEY_ROWID + "=" + place;
db.update(DATABASE_TABLE, values, where, null);
place++;
c.close();
}
Tuttavia, mentre questo funziona è estremamente lento e sarà solo peggiorare come il mio numero di domande aumenta. C'è un modo rapido per fare tutto questo?
Grazie! Post scriptum Idealmente dovrebbe aggiornare la riga solo se la riga è presente. Quindi se in un aggiornamento decido di rimuovere una domanda, dovrebbe tenerne conto e non aggiungere una nuova riga se la riga non contiene altri dati. Potrebbe essere più facile ottenerlo per rimuovere le righe che non contengono dati delle domande piuttosto che impedire che vengano aggiunte.
penso tu intendessi "Aggiorna new_quiz", non old_quiz =) – hiBrianLee
Scusa, questo è quello che intendevo . Grazie: D – AndroidPenguin
@AndroidPenguin, modificato come hai detto nel tuo commento. –