114 votes

Android: mise à niveau de la version de la base de données et ajout d'un nouveau tableau

J'ai déjà créé des tables sqlite pour mon application, mais je souhaite maintenant ajouter une nouvelle table à la base de données.

J'ai changé la version de la base de données comme ci-dessous

 private static final int DATABASE_VERSION = 2;
 

et Ajout d'une chaîne pour créer un tableau

 private static final String DATABASE_CREATE_color = 
   "CREATE TABLE IF NOT EXISTS files(color text, incident_id text)";
 

onCreate et onUpgrade comme ci-dessous:

 @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);

    }
 

Mais pour une raison quelconque, la nouvelle table n'est pas en cours de création. Qu'est-ce que je fais mal?

273voto

jkschneider Points 4014

1. Sur onCreate() et onUpdate()

onCreate(..) est appelée chaque fois que l'application est fraîchement installé. onUpgrade est appelée chaque fois que l'application est mis à jour et lancé et la version de base de données n'est pas la même.

2. L'incrémentation de la version db

Vous avez besoin d'un constructeur comme:

MyOpenHelper(Context context) {
   super(context, "dbname", null, 2); // 2 is the database version
}

IMPORTANT: l'Incrémentation de la version de l'application à lui seul n'est pas suffisant pour onUpgrade d'être appelé!

3. N'oubliez pas vos nouveaux utilisateurs!

N'oubliez pas d'ajouter

database.execSQL(DATABASE_CREATE_color);

pour votre onCreate() la méthode ou les applications nouvellement installées manque la table.

4. Comment faire face à de multiples modifications de base de données au fil du temps

Lorsque vous avez successives de l'application des mises à niveau, dont plusieurs ont de la base de données des mises à niveau, vous voulez être sûr de vérifier oldVersion:

onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
   switch(oldVersion) {
   case 1:
       db.execSQL(DATABASE_CREATE_color);
       // we want both updates, so no break statement here...
   case 2:
       db.execSQL(DATABASE_CREATE_someothertable); 
   }
}

De cette façon, lorsqu'un utilisateur les mises à niveau à partir de la version 1 à la version 3, ils obtiennent les deux mises à jour. Lorsqu'un utilisateur les mises à niveau de la version 2 à 3, ils sont juste à la révision 3 de mise à jour... Après tout, vous ne pouvez pas compter sur 100% de votre base d'utilisateurs pour mettre à niveau chaque fois que vous relâchez une mise à jour. Parfois, ils sautent d'une mise à jour ou 12 :)

5. En gardant votre numéro de révision sous contrôle, alors que le développement de

Et enfin... l'appel

adb uninstall <yourpackagename>

totalement désinstalle l'application. Lorsque vous installez de nouveau, vous avez la garantie de frapper onCreate qui vous évite de devoir garder l'incrémentation de la version de base de données dans la stratosphère que vous développez...

9voto

Greyson Points 2032

Votre code semble correct. Ma suggestion est que la base de données pense déjà qu'elle a été mise à niveau. Si vous avez exécuté le projet après avoir incrémenté le numéro de version, mais avant d’ajouter l’appel execSQL , la base de données de votre périphérique / émulateur de test peut déjà croire qu’elle est à la version 2.

Un moyen rapide de le vérifier consiste à remplacer le numéro de version par 3 par le numéro de version. Si cela se met à niveau par la suite, vous savez que c'est simplement parce que votre appareil pensait qu'il avait déjà été mis à niveau.

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