Android SQLite Upgrade ohne Datenverlust

Ich habe eine SQLite-Datenbank erfolgreich erstellt und es funktioniert gut. Wenn jedoch die Methode onUpgrade aufgerufen wird, möchte ich dies ohne Datenverlust tun. Die App, die ich entwickle, ist eine Quiz-App. Wenn die onCreate-Methode aufgerufen wird, erstelle ich einfach eine Datenbank mit Fragen, Antworten usw. und fülle sie vorab aus. In der letzten Spalte wird angegeben, ob die Frage als Favorit festgelegt wurde oder nicht. Wenn die Methode onUpgrade aufgerufen wird, möchte ich diese eine Spalte vorübergehend speichern, die gesamte Datenbank löschen, sie mit allen Änderungen neu erstellen, die ich an alten Fragen vorgenommen habe, und dann neue Fragen hinzufügen -add zurück die Fragen, die sie als Favoriten festgelegt haben.

Eine Option, die ich ausprobiert habe, war die folgende:

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

Dies funktioniert jedoch nicht, da INSERT INTO nur neue Zeilen hinzufügt, anstatt die vorhandenen Zeilen zu ersetzen. Ich habe auch versucht, REPLACE INTO, INSERT oder REPLACE INTO und

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

von denen keine arbeiten.

Zur Zeit ist es so eingerichtet, dass es den Namen der Tabelle ändert, die Methode onCreate (db) aufruft und dann einen Cursor erstellt, der jede Zeile liest und die Methode db.update () verwendet, wie unten gezeigt:

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

}

Obwohl dies funktioniert, ist es extrem langsam und wird sich nur verschlechtern, wenn ich mehr Fragen stelle. Gibt es einen schnellen Weg, dies alles zu tun?

Vielen Dank! P.S. Im Idealfall sollte die Zeile nur aktualisiert werden, wenn sie vorhanden ist. Wenn ich mich bei einem Upgrade entscheide, eine Frage zu entfernen, sollte dies berücksichtigt werden und keine neue Zeile hinzugefügt werden, wenn die Zeile keine anderen Daten enthält. Es ist möglicherweise einfacher, Zeilen zu entfernen, die keine Fragendaten enthalten, als das Hinzufügen zu verhindern.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage