Une action qui peux se révéler délicate dans une application android c’est la mise à jour de la base de données sqlite lors de la publication d’une nouvelle version de votre app.
Le but étant d’arriver à modifier votre schema sans pour autant perdre les données que vous utilisateurs pourraient avoir enregistré.
Le problème qui se pose , c’est que sqlite à une fonction ALTER TABLE très limitée.
Vous pouvez renommer une table :
ALTER TABLE table1 RENAME TO table2
ou ajouter une colonne à vote table :
ALTER TABLE table1 ADD COLUMN newcolonne
Mais si vous avez besoin de modifier une contrainte ou encore le type d’un champs et bien ce n’est pas possible. il faut donc sauvegarder les données et les réinjecter dans une autre table.
Voici un petit exemple :
public class DBHelper extends SQLiteOpenHelper { public DbHelper(Context context, String name, CursorFactory factory,int version) { super(context, name, factory, version); } @Override public void onCreate(SQLiteDatabase db) { //Création des tables } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //Mise à jour de la bdd de v1 à v2 if(oldVersion == 1 && newVersion == 2) { try { db.beginTransaction(); //Création de la nouvelle table, avec toute les modifications db.execSQL("CREATE TABLE table1_tmp (a,b)"); //Transfert des données de table1 vesr table1_tmp db.execSQL("INSERT INTO table1_tmp (a,b) SELECT (a,b) FROM table1"); //Suppression de l'ancienne table db.execSQL("DROP TABLE IF EXISTS table1"); //Renomage de la table nouvellement créée afin de prendre la place de celle supprimée db.execSQL("ALTER TABLE table1_tmp RENAME TO table1"); db.setTransactionSuccessful(); } catch (Exception e) { e.printStackTrace(); } finally { db.endTransaction(); } } } }
On utilise ici une transaction pour s’assurer de ne pas perdre de données au passage. Si jamais quelque chose se passe mal , les modifications seront rollback automatiquement.