Android SQLite Upgrade sin perder datos

He creado una base de datos SQLite con éxito y funciona bien. Sin embargo, cuando se llama al método onUpgrade, me gustaría hacerlo sin perder datos. La aplicación que estoy desarrollando es una aplicación de prueba. Simplemente, cuando se llama el método onCreate, creo y prepopulo una base de datos con preguntas, respuestas, etc. La última columna es si han establecido la pregunta como favorita o no. Lo que me gustaría hacer es que cuando se invoque el método onUpgrade, me gustaría guardar temporalmente esa columna, eliminar toda la base de datos, recrearla con cualquier edición que haya hecho a las preguntas anteriores y agregar cualquier pregunta nueva. -Agregaremos las preguntas que establezcan como favoritas.

Así que una opción que probé fue la siguiente:

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

Sin embargo, esto no funciona debido a que INSERT INTO simplemente agrega nuevas filas en lugar de reemplazar las filas existentes. También he intentado REEMPLAZAR EN, INSERTAR O REEMPLAZAR EN y

db.execSQL("INSERT INTO quiz (_id, favouries) SELECT _id, favourites FROM temp_quiz");

de los cuales ninguno funciona.

Actualmente lo tengo configurado para trabajar modificando el nombre de la tabla, llamando al método onCreate (db) y luego configurando un cursor que lee cada fila y usa el método db.update () como se muestra a continuación:

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

}

Sin embargo, si bien esto funciona, es extremadamente lento y solo empeorará a medida que aumente mi número de preguntas. ¿Hay una manera rápida de hacer todo esto?

¡Gracias! PD Lo ideal es que solo se actualice la fila si la fila está presente. Así que si en una actualización decido eliminar una pregunta, debería tener esto en cuenta y no agregar una nueva fila si la fila no contiene ningún otro dato. Podría ser más fácil hacerlo para eliminar filas que no tienen datos de preguntas en lugar de evitar que se agreguen.

Respuestas a la pregunta(6)

Su respuesta a la pregunta