SQLite
 sql >> Datenbank >  >> RDS >> SQLite

Wann wird SQLiteOpenHelper onCreate() / onUpgrade() ausgeführt?

SQLiteOpenHelper onCreate() und onUpgrade() Rückrufe werden aufgerufen, wenn die Datenbank tatsächlich geöffnet wird, beispielsweise durch einen Aufruf von getWritableDatabase() . Die Datenbank wird nicht geöffnet, wenn das Datenbankhilfsobjekt selbst erstellt wird.

SQLiteOpenHelper Versionen der Datenbankdateien. Die Versionsnummer ist der int Argument an den Konstruktor übergeben. In der Datenbankdatei wird die Versionsnummer in PRAGMA user_version gespeichert .

onCreate() wird nur ausgeführt, wenn die Datenbankdatei nicht existierte und gerade erstellt wurde. Wenn onCreate() erfolgreich zurückkehrt (keine Ausnahme auslöst), wird angenommen, dass die Datenbank mit der angeforderten Versionsnummer erstellt wurde. Als Folge davon sollten Sie SQLException nicht abfangen s in onCreate() selbst.

onUpgrade() wird nur aufgerufen, wenn die Datenbankdatei existiert, aber die gespeicherte Versionsnummer niedriger ist als im Konstruktor angefordert. Der onUpgrade() sollte das Tabellenschema auf die angeforderte Version aktualisieren.

Beim Ändern des Tabellenschemas im Code (onCreate() ), sollten Sie sicherstellen, dass die Datenbank aktualisiert wird. Zwei Hauptansätze:

  1. Löschen Sie die alte Datenbankdatei, damit onCreate() wird wieder gefahren. Dies wird häufig zur Entwicklungszeit bevorzugt, wenn Sie die Kontrolle über die installierten Versionen haben und Datenverlust kein Problem darstellt. Einige Möglichkeiten zum Löschen der Datenbankdatei:

    • Deinstallieren Sie die Anwendung. Verwenden Sie den Anwendungsmanager oder adb uninstall your.package.name aus der Shell.

    • Anwendungsdaten löschen. Verwenden Sie den Anwendungsmanager.

  2. Erhöhen Sie die Datenbankversion, sodass onUpgrade() wird aufgerufen. Dies ist etwas komplizierter, da mehr Code benötigt wird.

    • Für Schema-Upgrades zur Entwicklungszeit, bei denen Datenverlust kein Problem darstellt, können Sie einfach execSQL("DROP TABLE IF EXISTS <tablename>") verwenden in, um Ihre vorhandenen Tabellen zu entfernen, und rufen Sie onCreate() auf um die Datenbank neu zu erstellen.

    • Für freigegebene Versionen sollten Sie die Datenmigration in onUpgrade() implementieren damit Ihre Benutzer ihre Daten nicht verlieren.