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.3 Le partage de contenus entre <strong>applications</strong><br />

5.3.1 Côté client : accéder à <strong>des</strong> fournisseurs<br />

Les fournisseurs de contenu permettent l’encapsulation de données, et, <strong>pour</strong> accéder à ces données,<br />

il faudra utiliser les fameuses URI. Ici, nous ne saurons pas où ni comment les données sont<br />

stockées. Dans une base de données, dans un fichier, sur un serveur distant ? Cela ne nous regarde<br />

pas, du moment que les données nous sont mises à disposition.<br />

Cependant, quel que soit le type de stockage, les données nous sont toujours présentées de la<br />

même manière. En effet, et un peu comme une base de données relationnelle, un fournisseur de<br />

contenu présente les données à une application extérieure dans une ou plusieurs tables. Chaque<br />

entrée dans la table est représentée dans une ligne et chaque colonne représente un attribut.<br />

Une chose importante à savoir avant de faire appel à un fournisseur de contenu : vous devez savoir<br />

par avance la structure <strong>des</strong> tables (ses attributs et les valeurs qu’ils peuvent prendre), car<br />

vous en aurez besoin <strong>pour</strong> exploiter correctement ce fournisseur de contenu. Il n’y a pas moyen<br />

d’obtenir ce genre d’informations, il faut que le développeur du fournisseur vous communique<br />

cette information.<br />

[[information]] | Un fournisseur n’a pas besoin d’avoir une clé primaire. S’il en a une, elle peut<br />

l’appeler _ID, même si ce n’est pas nécessaire. Si vous le faites, alors Android <strong>pour</strong>ra faire<br />

quelques traitements automatiquement. Par exemple, si vous voulez lier <strong>des</strong> données depuis un<br />

fournisseur vers une ListView, il vaut mieux que la clé primaire s’appelle _ID de façon à ce que<br />

le ListView puisse deviner tout seul qu’il s’agit d’une clé primaire.<br />

Examinons les éléments architecturaux <strong>des</strong> fournisseurs de contenu, ainsi que la relation qui<br />

existe entre les fournisseurs de contenu et les autres abstractions qui permettent l’accès aux données.<br />

5.3.1.1 Accéder à un fournisseur<br />

Il est possible d’accéder aux données d’une autre application avec un objet client ContentResolver.<br />

Cet objet a <strong>des</strong> métho<strong>des</strong> qui appellent d’autres métho<strong>des</strong>, qui ont le même nom, mais qui se<br />

trouvent dans un objet fournisseur, c’est-à-dire l’objet qui met à disposition le contenu <strong>pour</strong><br />

les autres <strong>applications</strong>. Les objets fournisseurs sont de type ContentProvider. Aussi, si<br />

votre ContentResolver a une méthode qui s’appelle myMethod, alors le ContentProvider<br />

aura aussi une méthode qui s’appelle myMethod, et quand vous appelez myMethod sur votre<br />

ContentResolver, il fera en sorte d’appeler myMethod sur le ContentProvider.<br />

[[question]] | Pourquoi je n’irais pas appeler ces métho<strong>des</strong> moi-même ? Cela irait plus vite et ce<br />

serait plus simple !<br />

Parce que ce n’est pas assez sécurisé ! Avec ce système, Android est certain que vous avez reçu les<br />

autorisations nécessaires à l’exécution de ces opérations.<br />

Vous vous rappelez ce qu’on avait fait <strong>pour</strong> les bases de données ? On avait écrit <strong>des</strong> métho<strong>des</strong> qui<br />

permettent de créer, lire, mettre à jour ou détruire <strong>des</strong> informations dans une base de données.<br />

Eh bien, ces métho<strong>des</strong>, appelées métho<strong>des</strong> CRUD, sont fournies par le ContentResolver. Ainsi,<br />

si mon ContentResolver demande poliment à un ContentProvider de lire <strong>des</strong> entrées dans<br />

la base de données de l’application dans laquelle se trouve ce ContentProvider, il appellera sur<br />

lui-même la méthode lireCesDonnées <strong>pour</strong> que soit appelée sur le ContentProvider la même<br />

méthode lireCesDonnées.<br />

365

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

Saved successfully!

Ooh no, something went wrong!