Archives par étiquette : transaction

Android upgrade sqlite

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.