Ich habe bereits SQLite-Tabellen für meine App erstellt, möchte aber jetzt der Datenbank eine neue Tabelle hinzufügen.
Ich habe die DB-Version wie folgt geändert
private static final int DATABASE_VERSION = 2;
und Zeichenfolge zum Erstellen einer Tabelle hinzugefügt
private static final String DATABASE_CREATE_color =
"CREATE TABLE IF NOT EXISTS files(color text, incident_id text)";
onCreate
und onUpgrade
wie folgt:
@Override
public void onCreate(SQLiteDatabase database) {
database.execSQL(DATABASE_CREATE_incident);
database.execSQL(DATABASE_CREATE_audio);
database.execSQL(DATABASE_CREATE_video);
database.execSQL(DATABASE_CREATE_image);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//drop table and add new tables when version 2 released.
db.execSQL(DATABASE_CREATE_color);
}
Aus irgendeinem Grund wird die neue Tabelle jedoch nicht erstellt. Was mache ich falsch?
Antworten:
1. Über onCreate () und onUpgrade ()
onCreate(..)
wird aufgerufen, wenn die App neu installiert wird.onUpgrade
wird aufgerufen, wenn die App aktualisiert und gestartet wird und die Datenbankversion nicht identisch ist.2. Inkrementieren der Datenbankversion
Sie benötigen einen Konstruktor wie:
WICHTIG: Das Inkrementieren der App-Version allein reicht nicht aus
onUpgrade
, um aufgerufen zu werden!3. Vergessen Sie nicht Ihre neuen Benutzer!
Vergiss nicht hinzuzufügen
Auch bei Ihrer onCreate () -Methode fehlt bei neu installierten Apps die Tabelle.
4. Umgang mit mehreren Datenbankänderungen im Laufe der Zeit
Wenn Sie aufeinanderfolgende App-Upgrades haben, von denen einige Datenbank-Upgrades haben, sollten Sie Folgendes überprüfen
oldVersion
:Auf diese Weise erhält ein Benutzer beim Upgrade von Version 1 auf Version 3 beide Updates. Wenn ein Benutzer ein Upgrade von Version 2 auf 3 durchführt, erhält er nur das Update für Version 3 ... Schließlich können Sie sich nicht darauf verlassen, dass 100% Ihrer Benutzerbasis jedes Mal aktualisiert werden, wenn Sie ein Update veröffentlichen. Manchmal überspringen sie ein Update oder 12 :)
5. Behalten Sie Ihre Revisionsnummern während der Entwicklung unter Kontrolle
Und schließlich ... anrufen
deinstalliert die App vollständig. Wenn Sie erneut installieren, werden Sie garantiert getroffen,
onCreate
was Sie davon abhält, die Datenbankversion während der Entwicklung in die Stratosphäre zu erhöhen ...quelle
oldVersion
Argument zu verwenden ? Wenn Upgrade-Anweisungen wiederholbar sind, werden Sie sie möglicherweise in einer meist aktuellen Datenbank wiederholen. Wenn eine der Anweisungen darin besteht, eine Tabelle abzuschneiden, wäre das sehr schlecht.newVersion
ist irgendwie nutzlos, da Sie die aktuelle Datenbankversion ohnehin immer im Konstruktor festlegen (siehe Teil 2) und sie immer übereinstimmt. Die Schlüsselidee dabei ist, dass Sie nicht einfach vonnewVersion
jedem Ort aus, an dem sich der Benutzer gerade befindet, ein Upgrade durchführen möchten, ohne jedes andere inkrementelle Upgrade dazwischen durchzuführen.CREATE_READINGS
Logik sollte niemals in onUpgrade sein, da sie in deronCreate
Methode Ihrer ersten Version enthalten war. Stellen Sie sich die Fälle imonUpgrade
Switch als "Ich aktualisiere FROMoldVersion
" vor. Sie würden die Lesetabelle nicht erstellen, wenn Sie ein Upgrade von Version 1 durchführen würden, da diese bereits vorhanden sein sollte. Hoffentlich macht das Sinn ...Ihr Code sieht korrekt aus. Mein Vorschlag ist, dass die Datenbank bereits denkt, dass sie aktualisiert wurde. Wenn Sie das Projekt nach dem Erhöhen der Versionsnummer, aber vor dem Hinzufügen des
execSQL
Aufrufs ausgeführt haben, glaubt die Datenbank auf Ihrem Testgerät / Emulator möglicherweise bereits, dass es sich um Version 2 handelt.Eine schnelle Möglichkeit, dies zu überprüfen, besteht darin, die Versionsnummer in 3 zu ändern. Wenn es danach aktualisiert wird, wissen Sie, dass dies nur darauf zurückzuführen ist, dass Ihr Gerät glaubte, dass es bereits aktualisiert wurde.
quelle
onCreate()
wie es jkschneider hervorhob.Sie können die SQLiteOpenHelper-
onUpgrade
Methode verwenden. In der onUpgrade-Methode erhalten Sie die oldVersion als einen der Parameter.onUpgrade
Verwenden Sie bei der Verwendung von aswitch
und in jedem dercase
s die Versionsnummer, um die aktuelle Version der Datenbank zu verfolgen.Am besten wechseln Sie von
oldVersion
bis zunewVersion
, erhöhen jeweilsversion
um 1 und aktualisieren dann die Datenbank Schritt für Schritt. Dies ist sehr hilfreich, wenn jemand mit Datenbankversion 1 die App nach langer Zeit auf eine Version mit Datenbankversion 7 aktualisiert und die App aufgrund bestimmter inkompatibler Änderungen abstürzt.Anschließend werden die Aktualisierungen in der Datenbank schrittweise durchgeführt, wobei alle möglichen Fälle abgedeckt werden, dh die für jede neue Version vorgenommenen Änderungen in der Datenbank werden berücksichtigt, wodurch verhindert wird, dass Ihre Anwendung abstürzt.
Beispielsweise:
quelle
@ jkschneiders Antwort ist richtig. Es gibt jedoch einen besseren Ansatz.
Schreiben Sie die erforderlichen Änderungen für jedes Update in eine SQL-Datei, wie unter dem Link https://riggaroo.co.za/android-sqlite-database-use-onupgrade-correctly/ beschrieben.
from_1_to_2.sql
from_2_to_3.sql
from_3_to_4.sql
Diese .sql-Dateien werden in der onUpgrade () -Methode entsprechend der Version der Datenbank ausgeführt.
DatabaseHelper.java
Ein Beispielprojekt finden Sie auch unter demselben Link: https://github.com/riggaroo/AndroidDatabaseUpgrades
quelle
Der Umgang mit Datenbankversionen ist ein sehr wichtiger Bestandteil der Anwendungsentwicklung. Ich gehe davon aus, dass Sie bereits eine erweiterte AppDbHelper-Klasse haben
SQLiteOpenHelper
. Wenn Sie es erweitern, müssen Sie implementierenonCreate
undonUpgrade
methodisieren.Wann
onCreate
undonUpgrade
Methoden aufgerufenonCreate
Wird aufgerufen, wenn die App neu installiert wird.onUpgrade
Wird aufgerufen, wenn die App aktualisiert wird.Organisieren von Datenbankversionen Ich verwalte Versionen in Klassenmethoden. Erstellen Sie die Implementierung der Schnittstellenmigration. ZB für die erste
MigrationV1
Klasse erstellen Klasse, zweite Version erstellenMigrationV1ToV2
(dies sind meine Namenskonvention)Beispielmigration:
onCreate
: DaonCreate
wird aufgerufen, wenn die Anwendung neu installiert wird, müssen wir auch alle Migrationen ausführen (Aktualisierungen der Datenbankversion). SoonCreate
wird es aussehen:onUpgrade
: Diese Methode wird aufgerufen, wenn die Anwendung bereits installiert und auf die neue Anwendungsversion aktualisiert ist. Wenn die Anwendung Datenbankänderungen enthält, fügen Sie alle Datenbankänderungen in die neue Migrationsklasse ein und erhöhen Sie die Datenbankversion.Angenommen, der Benutzer hat eine Anwendung mit der Datenbankversion 1 installiert, und jetzt wird die Datenbankversion auf 2 aktualisiert (alle Schemaaktualisierungen bleiben erhalten
MigrationV1ToV2
). Wenn die Anwendung aktualisiert wird, müssen wir die Datenbank aktualisieren, indem wir Änderungen am DatenbankschemaMigrationV1ToV2
wie folgt anwenden :quelle