Ich habe erfolgreich eine SQLite-Datenbank erstellt und es funktioniert einwandfrei. Wenn die Methode onUpgrade aufgerufen wird, möchte ich dies jedoch tun, ohne Daten zu verlieren. Die App, die ich entwickle, ist eine Quiz-App. Wenn die onCreate-Methode aufgerufen wird, erstelle ich einfach eine Datenbank mit Fragen, Antworten usw. Die letzte Spalte gibt an, ob sie die Frage als Favorit festgelegt haben oder nicht. Was ich tun möchte, ist, dass wenn ich die Methode onUpgrade aufgerufen habe, ich diese Spalte vorübergehend speichern, die gesamte Datenbank löschen, sie mit allen Bearbeitungen, die ich an alten Fragen vorgenommen habe, neu erstellen und dann neue Fragen hinzufügen würde -Füge die Fragen zurück, die sie als Favoriten festgelegt haben.
Also eine Option, die ich ausprobiert habe, war die folgende:
%Vor%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
%Vor%von denen keine funktionieren.
Momentan habe ich es eingerichtet, um zu arbeiten, indem ich den Namen der Tabelle ändere, die onCreate (db) -Methode aufruft und dann einen Cursor einrichtet, der jede Zeile liest und die db.update () -Methode verwendet, wie unten gezeigt:
%Vor%Aber solange das funktioniert, ist es extrem langsam und wird nur noch schlimmer, wenn meine Anzahl von Fragen steigt. Gibt es einen schnellen Weg, all dies zu tun?
Danke! P.S. Idealerweise sollte die Zeile nur aktualisiert werden, wenn die Zeile vorhanden ist. Wenn ich also in einem Upgrade entscheide, eine Frage zu entfernen, sollte dies berücksichtigt werden und keine neue Zeile hinzugefügt werden, wenn die Zeile keine weiteren Daten enthält. Es könnte einfacher sein, Zeilen zu entfernen, die keine Fragedaten enthalten, anstatt zu verhindern, dass sie hinzugefügt werden.
Wenn Sie beispielsweise noch nicht wissen, wie Sie die Version der SQLite aktualisieren, wenn Sie das Datenbankschema aktualisieren, verwenden Sie die Methode needUpgrade (int newVersion)!
Mein Code:
%Vor%Ich habe Ihr Quiz-Tabellenschema nicht sehen können, aber ich nehme an, es hat Felder wie "Frage", "Antwort", "Favoriten" und irgendeine Art von Primärschlüssel, um jede Frage zu identifizieren Rufen Sie rowId jetzt einfach an.
%Vor%Dadurch werden nur die Zeilen der neuen Quiz-Tabelle aktualisiert, die mit der alten Quiz-Tabelle übereinstimmen, und der Favoriten-Wert aus der alten Quiz-Tabelle festgelegt.
Ich nehme an, Sie haben eine Art eindeutigen Bezeichner, um jede Frage zu identifizieren, also verwenden Sie anstelle der obigen rowId diese (Frage Nummer oder etwas).