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.

5 Concepts avancés<br />

}<br />

Comme vous pouvez le voir, ma classe Metier dérive de BaseColumns. Il s’agit d’une petite<br />

classe qui définit deux attributs indispensables : _ID (qui représente l’identifiant d’une ligne)<br />

et _COUNT (qui représente le nombre de lignes dans une requête).<br />

5.3.2.4 Le Manifest<br />

Chaque fournisseur de contenu s’enregistre sur un appareil à l’aide du Manifest. On aura besoin<br />

de préciser une autorité ainsi qu’un identifiant et la combinaison <strong>des</strong> deux se doit d’être unique.<br />

Cette combinaison n’est que la base utilisée <strong>pour</strong> constituer les requêtes de contenu. Le nœud<br />

doit être de type provider, puis on verra ensuite deux attributs : <strong>android</strong>:name <strong>pour</strong> le nom du<br />

composant (comme <strong>pour</strong> tous les composants) et <strong>android</strong>:authorities <strong>pour</strong> l’autorité.<br />

<br />

5.3.2.5 La programmation<br />

On fait dériver une classe de ContentProvider <strong>pour</strong> gérer les requêtes qui vont s’effectuer sur<br />

notre fournisseur de contenu. Chaque opération qu’effectuera une application sur votre fournisseur<br />

de contenu sera à gérer dans la méthode idoine. Je vais donc vous présenter le détail de<br />

chaque méthode.<br />

5.3.2.5.1 boolean onCreate() Cette méthode de callback est appelée automatiquement dès<br />

qu’un ContentResolver essaie d’y accéder <strong>pour</strong> la première fois.<br />

Le plus important ici est d’éviter les opérations qui prennent du temps, puisqu’il s’agit du démarrage,<br />

sinon celui-ci durera trop longtemps. Je pense par exemple à éviter les initialisations qui<br />

<strong>pour</strong>raient prendre du temps (comme créer, ouvrir, mettre à jour ou analyser la base de données),<br />

de façon à permettre aux <strong>applications</strong> de se lancer plus vite, d’éviter les efforts inutiles si le fournisseur<br />

n’est pas nécessaire, d’empêcher les erreurs de base de données (comme par exemple un<br />

disque plein), ou d’arrêter le lancement de l’application. De ce fait, faites en sorte de ne jamais<br />

appeler getReadableDatabase() ou getWritableDatabase() dans cette méthode.<br />

La meilleure chose à faire, est d’implémenter onOpen(SQLiteDatabase) comme nous avons<br />

appris à le faire, <strong>pour</strong> initialiser la base de données quand elle est ouverte <strong>pour</strong> la première fois<br />

(dès que le fournisseur reçoit une quelconque requête concernant la base).<br />

Par exemple, vous pouvez créer un SQLiteOpenHelper dans onCreate(), mais ne créez les<br />

tables que la première fois que vous ouvrez vraiment la base. Rappelez-vous que la première fois<br />

que vous appelez getWritableDatabase() on fera automatiquement appel à onCreate() de<br />

SQLiteOpenHelper.<br />

N’oubliez pas de retourner true si tout s’est bien déroulé.<br />

public boolean onCreate() {<br />

// Je crée mon Handler comme nous l'avons vu dans le chapitre sur les bases de donnée<br />

mHandler = new DatabaseHandler(getContext(), VERSION);<br />

// Et si tout s'est bien passé, je retourne true<br />

374

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

Saved successfully!

Ooh no, something went wrong!