Confusion: Comment SQLiteOpenHelper onUpgrade() se comporte? Et, ensemble, avec l'importation d'une vieille sauvegarde de base de données?
supposons que j'ai une base de données de la table test_table avec 2 colonnes et un correspondant de créer un script dans le SQLiteOpenHelper:
DB_VERSION = 1:
public void onCreate(SQLiteDatabase db)
{
db.execSql("CREATE table test_table (COL_A, COL_B);
}
C'est la première version de l'application 1, qui est publié dans le Play Store.
Après un certain temps, il y a une mise à jour de l'application et de l'utilisé la base de données.
Je suppose que le SQLiteOpenHelper classe doit être adapté comme ceci:
DB_VERSION = 2:
public void onCreate(SQLiteDatabase db)
{
db.execSql("CREATE table test_table (COL_A, COL_B, COL_C)");
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSql("ALTER TABLE test_table ADD Column COL_C");
}
Après un certain temps, une autre application de mise à jour:
DB_VERSION = 3:
public void onCreate(SQLiteDatabase db)
{
db.execSql("CREATE table test_table (COL_A, COL_B, COL_C, COL_D)");
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSql("ALTER TABLE test_table ADD Column COL_D");
}
--> C'est là que j'ai besoin de conseils.
Si l'utilisateur installe la version de l'application 1, il a des Colonnes A et B.
Si il met ensuite à jour de la version 2, onUpgrade incendies et ajoute une colonne C.
Les nouveaux utilisateurs qui installer à partir de zéro obtenir les 3 colonnes via l'instruction create.
Si l'utilisateur met à jour à la version 3, onUpgrade feux de nouveau et d'une colonne D est ajoutée.
Mais QUE faire SI l'utilisateur installe la version de l'application 1, puis saute de la mise à jour de la version 2 et les mises à jour de la version 3? Puis il aurait manqué le
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSql("ALTER TABLE test_table ADD Column COL_C");
}
partie et seulement
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSql("ALTER TABLE test_table ADD Column COL_D");
}
serait appelée, ce qui conduit à une table test_table(COL_A, COL_B, COL_D)??
Quelle est la bonne façon de gérer la base de données des mises à niveau d'une application, de sorte que l'utilisateur ne veut pas perdre ses données?
Disposez-vous pour vérifier tous les possibles (vieux) versions dans le onUpgrade() la méthode et exécuter les différentes instructions alter table basée sur cette version?
Je demande car dans mon application, l'utilisateur a la possibilité d'exporter et d'importer les données, ce qui n'est rien de plus que l'exportation: copie de l'ensemble de la base de données à l'écart et à l'importation: remplacer l'application de base de données avec la copie de sauvegarde de la base de données.
Ce qui se passe si l'utilisateur a la version de l'application 1, les exportations de la base de données, les mises à niveau de l'application (nouvelle structure de base de données) et les importations de l'ancienne version 1 de sauvegarde?
--> Comment SQLiteOpenHelper se comporter?
--> Quelle est la bonne façon de gérer db mises à niveau avec de l'importation/exportation de la fonctionnalité?
Vous devez vous connecter pour publier un commentaire.
En gros, oui.
Une approche commune pour ce qui est de faire des paires mises à jour:
Cela équivaut approximativement à Rails de migrations, par exemple.
Si par "copier l'ensemble de la base de données à l'écart", vous avez littéralement signifie une pleine copie de fichiers de la base de données SQLite fichier, puis quand
SQLiteOpenHelper
va ouvrir la sauvegarde restaurée, il ne sera que la base de données a l'ancienne version de schéma et passera paronUpgrade()
comme d'habitude.Je soupçonne que la réponse est: soit faire votre sauvegarde par copie de la totalité du fichier, ou aussi organiser à la sauvegarde et la restauration de la version de schéma, que vous pouvez obtenir en appelant
getVersion()
sur unSQLiteDatabase
objet. Cela étant dit, je n'ai pas abordé ce scénario beaucoup, et il peut y avoir plus de questions que je ne pense pas.pseudo ci-dessous montre le code increamental de mise à niveau
En incrémental de mise à niveau, je veux dire - Avis le manque d'instruction break dans le cas 2 et 3
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
continuer à ajouter de nouveaux cas pour chaque nouvelle base de données mise à niveau de version qui fera le increamental changements
je soupçonne que vous pouvez également créer une nouvelle table avec toutes les colonnes dont vous avez besoin
CREATE TABLE new_test_table (COL_A, COL_B, COL_C,COL_D);
de copier les données de la table ancienne à la nouvelle
INSERT INTO new_test_table SELECT * FROM test_table;
chute de l'ancien tableau
DROP TABLE test_table;
et renommez la nouvelle table
ALTER TABLE new_test_table
RENAME TO test_table;
donc en bref
de cette façon, vous n'avez pas à vous soucier de dataloss ou des changements progressifs
Je pense que c'est trop tard pour répondre à cette question, mais elle peut aider les autres.
Si l'utilisateur installe l'app premier temps, il va obtenir toutes colonne de onCreate
Si l'ancienne version de la base de données 2 cas 2 ajouter la colonne C et D.
Si l'ancienne version de la base de données de 3 cas 3 ajouter que la colonne E
De cette façon, il n'y a pas de confusion à propos de la version de base de données.