SQLite
 sql >> Base de données >  >> RDS >> SQLite

Quand SQLiteOpenHelper onCreate() / onUpgrade() s'exécute-t-il ?

SQLiteOpenHelper onCreate() et onUpgrade() les rappels sont invoqués lorsque la base de données est réellement ouverte, par exemple par un appel à getWritableDatabase() . La base de données n'est pas ouverte lorsque l'objet d'assistance de base de données lui-même est créé.

SQLiteOpenHelper versions les fichiers de la base de données. Le numéro de version est le int argument passé au constructeur. Dans le fichier de base de données, le numéro de version est stocké dans PRAGMA user_version .

onCreate() n'est exécuté que lorsque le fichier de base de données n'existe pas et vient d'être créé. Si onCreate() retourne avec succès (ne lève pas d'exception), la base de données est supposée être créée avec le numéro de version demandé. Par implication, vous ne devriez pas attraper SQLException s dans onCreate() vous-même.

onUpgrade() n'est appelé que lorsque le fichier de base de données existe mais que le numéro de version stocké est inférieur à celui demandé dans le constructeur. Le onUpgrade() doit mettre à jour le schéma de la table vers la version demandée.

Lors de la modification du schéma de la table dans le code (onCreate() ), vous devez vous assurer que la base de données est mise à jour. Deux approches principales :

  1. Supprimez l'ancien fichier de base de données afin que onCreate() est exécuté à nouveau. Ceci est souvent préféré au moment du développement où vous avez le contrôle sur les versions installées et la perte de données n'est pas un problème. Quelques façons de supprimer le fichier de base de données :

    • Désinstallez l'application. Utilisez le gestionnaire d'applications ou adb uninstall your.package.name du shell.

    • Effacer les données d'application. Utilisez le gestionnaire d'applications.

  2. Incrémentez la version de la base de données afin que onUpgrade() est invoqué. C'est un peu plus compliqué car plus de code est nécessaire.

    • Pour les mises à niveau de schéma de temps de développement où la perte de données n'est pas un problème, vous pouvez simplement utiliser execSQL("DROP TABLE IF EXISTS <tablename>") in pour supprimer vos tables existantes et appeler onCreate() pour recréer la base de données.

    • Pour les versions publiées, vous devez implémenter la migration des données dans onUpgrade() afin que vos utilisateurs ne perdent pas leurs données.