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 DB comme ci-dessous
private static final int DATABASE_VERSION = 2;
et Ajout d'une chaîne pour créer une table
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 créée. Qu'est-ce que je fais mal?
Réponses:
1. À propos de onCreate () et onUpgrade ()
onCreate(..)
est appelée chaque fois que l'application est fraîchement installée.onUpgrade
est appelée chaque fois que l'application est mise à niveau et lancée et que la version de la base de données n'est pas la même.2. Incrémentation de la version db
Vous avez besoin d'un constructeur comme:
IMPORTANT: incrémenter la version de l'application seule ne suffit pas pour
onUpgrade
être appelé!3. N'oubliez pas vos nouveaux utilisateurs!
N'oubliez pas d'ajouter
à votre méthode onCreate () ou les applications nouvellement installées n'auront pas le tableau.
4. Comment gérer plusieurs changements de base de données au fil du temps
Lorsque vous avez des mises à niveau d'applications successives, dont plusieurs ont des mises à niveau de base de données, vous voulez être sûr de vérifier
oldVersion
:De cette façon, lorsqu'un utilisateur passe de la version 1 à la version 3, il obtient les deux mises à jour. Lorsqu'un utilisateur passe de la version 2 à la version 3, il ne reçoit que la mise à jour de la révision 3 ... Après tout, vous ne pouvez pas compter sur 100% de votre base d'utilisateurs pour mettre à jour chaque fois que vous publiez une mise à jour. Parfois, ils sautent une mise à jour ou 12 :)
5. Gardez vos numéros de révision sous contrôle tout en développant
Et enfin ... appeler
désinstalle totalement l'application. Lorsque vous réinstallez, vous êtes assuré de frapper,
onCreate
ce qui vous évite d'avoir à continuer à incrémenter la version de la base de données dans la stratosphère au fur et à mesure que vous développez ...la source
oldVersion
argument adopté? Si des instructions de mise à niveau sont répétables, vous pouvez finir par les répéter sur une base de données essentiellement à jour. Si l'une des instructions est de tronquer une table, ce serait très mauvais.newVersion
est un peu inutile, car vous définissez toujours la version actuelle de la base de données dans le constructeur (voir la partie 2) et elle correspondra toujours. L'idée clé ici est que vous ne voulez pas simplement effectuer une mise à niveau depuis l'endroit où l'utilisateur se trouvenewVersion
sans passer par toutes les autres mises à niveau incrémentielles entre les deux.CREATE_READINGS
logique ne devrait jamais être dans onUpgrade, puisqu'elle était dans laonCreate
méthode de votre première version. Considérez les cas dans leonUpgrade
commutateur comme «Je mets à jour DEoldVersion
». Vous ne créeriez pas le tableau des lectures si vous mettiez à niveau à partir de la version 1, car il devrait déjà exister. J'espère que cela a du sens ...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'
execSQL
appel, la base de données de votre périphérique de test / émulateur peut déjà croire qu'elle est à la version 2.Un moyen rapide de vérifier cela serait de changer le numéro de version en 3 - s'il est mis à niveau après cela, vous savez que c'est simplement parce que votre appareil pensait qu'il était déjà mis à niveau.
la source
onCreate()
comme l'a souligné jkschneider.Vous pouvez utiliser la
onUpgrade
méthode de SQLiteOpenHelper . Dans la méthode onUpgrade, vous obtenez l'ancienne version comme l'un des paramètres.Dans l'
onUpgrade
utilisation aswitch
et dans chacun descase
s, utilisez le numéro de version pour garder une trace de la version actuelle de la base de données.Il est préférable de faire une boucle de
oldVersion
ànewVersion
, en incrémentantversion
de 1 à la fois, puis de mettre à niveau la base de données étape par étape. Ceci est très utile lorsque quelqu'un avec la version 1 de la base de données met à niveau l'application après une longue période, vers une version utilisant la version 7 de la base de données et que l'application commence à planter en raison de certaines modifications incompatibles.Ensuite, les mises à jour dans la base de données se feront par étapes, couvrant tous les cas possibles, c'est-à-dire en intégrant les modifications de la base de données effectuées pour chaque nouvelle version et en évitant ainsi que votre application ne plante.
Par exemple:
la source
La réponse de @ jkschneider est juste. Cependant, il existe une meilleure approche.
Écrivez les modifications nécessaires dans un fichier sql pour chaque mise à jour comme décrit dans le lien https://riggaroo.co.za/android-sqlite-database-use-onupgrade-correctly/
from_1_to_2.sql
from_2_to_3.sql
from_3_to_4.sql
Ces fichiers .sql seront exécutés dans la méthode onUpgrade () selon la version de la base de données.
DatabaseHelper.java
Un exemple de projet est également fourni dans le même lien: https://github.com/riggaroo/AndroidDatabaseUpgrades
la source
La gestion des versions de bases de données est une partie très importante du développement d'applications. Je suppose que vous avez déjà l'extension de la classe AppDbHelper
SQLiteOpenHelper
. Lorsque vous l'étendez, vous devrez l'implémenteronCreate
et laonUpgrade
méthode.Quand
onCreate
etonUpgrade
méthodes appeléesonCreate
appelé lorsque l'application est nouvellement installée.onUpgrade
appelé lors de la mise à jour de l'application.Organisation des versions de la base de données Je gère les versions dans une méthode de classe. Créer la mise en œuvre de la migration d'interface. Par exemple, pour la première version de la
MigrationV1
classe de création , la deuxième version de créationMigrationV1ToV2
(ce sont ma convention de dénomination)Exemple de migration:
onCreate
: Étant donnéonCreate
qu'il sera appelé lorsque l'application fraîchement installée, nous devons également exécuter toutes les migrations (mises à jour de la version de la base de données). AlorsonCreate
volonté se présente comme suit:onUpgrade
: Cette méthode sera appelée lorsque l'application est déjà installée et qu'elle est mise à jour vers la nouvelle version de l'application. Si l'application contient des modifications de base de données, placez toutes les modifications de base de données dans la nouvelle classe de migration et incrémentez la version de la base de données.Par exemple, disons que l'utilisateur a installé une application qui a la version de base de données 1, et maintenant la version de la base de données est mise à jour à 2 (toutes les mises à jour de schéma sont conservées
MigrationV1ToV2
). Maintenant, lorsque l'application est mise à niveau, nous devons mettre à niveau la base de données en appliquant les changements de schéma de base de donnéesMigrationV1ToV2
comme ceci:la source