313 votes

Quand est SQLiteOpenHelper onCreate() / onUpgrade() exécuter?

Je créer mes tables dans ma SQLiteOpenHelper onCreate() mais recevoir

SQLiteException: no such table

ou

SQLiteException: no such column

erreurs. Pourquoi?

(C'est l'organisation issue de la synthèse des dizaines de questions similaires chaque semaine. Cherchant à fournir un "canonique" wiki de la communauté de question/réponse, ici, de sorte que toutes ces questions peuvent être adressées à une bonne référence.)

372voto

laalto Points 50581

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

SQLiteOpenHelper versions les fichiers de 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ée que lorsque le fichier de base de données n'existe pas et a été créé. Si onCreate() retourne avec succès (ne lance pas d'exception), la base de données est supposé être créé à la demande du numéro de version. Comme conséquence, vous ne devriez pas attraper SQLExceptions dans onCreate() vous-même.

onUpgrade() n'est appelée que lorsque le fichier de base de données existe, mais la version stockée est inférieure à celle demandée dans le constructeur. L' onUpgrade() devez mettre à jour le schéma de la table à la version demandée.

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

  1. Supprimez l'ancien fichier de base de données de sorte qu' onCreate() est exécuté à nouveau. C'est souvent préféré au temps de 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ésinstaller l'application. Utilisez le gestionnaire d'application ou d' adb uninstall your.package.name de la carapace.

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

  2. Incrémenter la version de base de données de sorte qu' onUpgrade() est invoquée. C'est un peu plus compliqué que plus le code est nécessaire.

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

    • Pour les versions, vous devez mettre en œuvre la migration des données en onUpgrade() si vos utilisateurs ne perdent pas leurs données.

105voto

Aun Points 451

pour plus d'ajouter des points manquants ici, conformément à la demande par Jaskey

Version de base de données est stockée dans le fichier de base de données sqlite.

catch est le constructeur de

SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)

Ainsi, lorsque la base de données helper constructeur est appelé avec un name (2ème paramètre), plateforme vérifie si la base de données existe ou pas et si la base de données existe, il obtient les informations de version du fichier de base de données d'en-tête et déclenche le droit de retour d'appel

comme déjà expliqué dans le vieux la réponse, si la base de données avec le nom n'existe pas, il déclenche onCreate.

ci-dessous l'explication expliquer onUpgrade cas avec un exemple Par exemple, votre première version de l'application a la DatabaseHelper (extension de SQLiteOpenHelper) avec le constructeur de passage de la version 1 et puis vous avez fourni une mise à niveau de l'application avec le nouveau code source ayant la version passé en 2, puis automatiquement lorsque le DatabaseHelper est construit, plate-forme de déclencheurs onUpgrade par voir le fichier existe déjà, mais la version est inférieure à la version actuelle qui vous avez passé. Maintenant que vous êtes de rabotage pour donner une troisième version de l'application avec la version db 3 (db version est augmenté uniquement lorsque schéma de base de données est d'être modifiées). Dans de tels increamental mises à niveau, vous devez écrire la logique de mise à niveau à partir de chaque version increamentally pour un meilleur code maintenable

exemple de pseudo-code ci-dessous

@Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        switch(oldVersion) {

        case 2:
                //upgrade logic from version 1 to 2
        case 3:
                //upgrade logic from version 2 to 3
        case 4:
                //upgrade logic from version 3 to 4
                break;
        default:
                throw new IllegalStateException(
                "onUpgrade() with unknown newVersion" + newVersion));
        }
    }

Avis manquants break déclaration dans les cas 2 et 3. C'est ce que je veux dire par la mise à niveau incrémentielle.

dire si l'ancienne version est 2 et nouvelle version est de 4, alors la logique de mise à niveau de la base de données de 2 à 3 puis à 4

si l'ancienne version est 3 et la nouvelle version est 4, il suffit d'exécuter la logique de mise à niveau de 3 à 4

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X