09.02.2017 Views

creez-des-applications-pour-android

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

4 Vers <strong>des</strong> <strong>applications</strong> plus complexes<br />

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {<br />

db.execSQL(METIER_TABLE_DROP);<br />

onCreate(db);<br />

}<br />

4.5.3 Opérations usuelles<br />

4.5.3.1 Récupérer la base<br />

Si vous voulez accéder à la base de données n’importe où dans votre code, il vous suffit de<br />

construire une instance de votre SQLiteOpenHelper avec le constructeur SQLiteOpenHelper(Context<br />

context, String name, SQLiteDatabase.CursorFactory factory, int version),<br />

où name est le nom de la base, factory est un paramètre qu’on va oublier <strong>pour</strong> l’instant — qui<br />

accepte très bien les null — et version la version voulue de la base de données.<br />

On utilise SQLiteDatabase getWritableDatabase() <strong>pour</strong> récupérer ou créer une base sur laquelle<br />

vous voulez lire et/ou écrire. La dernière méthode qui est appelée avant de fournir la base<br />

à getWritableDatabase() est la méthode de callback void onOpen(SQLiteDatabase db),<br />

c’est donc l’endroit où vous devriez effectuer <strong>des</strong> opérations si vous le souhaitez.<br />

Cependant, le système fera appel à une autre méthode avant d’appeler onOpen(SQLiteDatabase).<br />

Cette méthode dépend de l’état de la base et de la version qui a été fournie à la création du<br />

SQLiteOpenHelper :<br />

— S’il s’agit de la première fois que vous appelez la base, alors ce sera la méthode<br />

onCreate(SQLiteDatabase) qui sera appelée.<br />

— Si la version fournie est plus récente que la dernière version fournie, alors on fait appel à<br />

onUpgrade(SQLiteDatabase, int, int).<br />

— En revanche, si la version fournie est plus ancienne, on considère qu’on effectue un retour<br />

en arrière et c’est onDowngrade(SQLiteDatabase, int, int) qui sera appelée.<br />

L’objet SQLiteDatabase fourni est un objet en cache, constant. Si <strong>des</strong> opérations se déroulent<br />

sur la base après que vous avez récupéré cet objet, vous ne les verrez pas sur l’objet. Il faudra en<br />

recréer un <strong>pour</strong> avoir le nouvel état de la base.<br />

Vous pouvez aussi utiliser la méthode SQLiteDatabase getReadableDatabase() <strong>pour</strong> récupérer<br />

la base, la différence étant que la base sera en lecture seule, mais uniquement s’il y a un<br />

problème qui l’empêche de s’ouvrir normalement. Avec getWritableDatabase(), si la base ne<br />

peut pas être ouverte en écriture, une exception de type SQLiteException sera lancée. Donc, si<br />

vous souhaitez ne faire que lire dans la base, utilisez en priorité getReadableDatabase().<br />

[[attention]] | Ces deux métho<strong>des</strong> peuvent prendre du temps à s’exécuter.<br />

Enfin, il faut fermer une base comme on ferme un flux avec la méthode void close().<br />

[[information]] | Récupérer un SQLiteDatabase avec l’une <strong>des</strong> deux métho<strong>des</strong> précédentes équivaut<br />

à faire un close() sur l’instance précédente de SQLiteDatabase.<br />

4.5.3.2 Réfléchir, puis agir<br />

Comme je l’ai déjà dit, chacun fait ce qu’il veut dès qu’il doit manipuler une base de données, ce<br />

qui fait qu’on se retrouve parfois avec du code incompréhensible ou difficile à mettre à jour. Une<br />

318

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!