Articles récents
Android : Le fournisseur de contenu
Nous avons vu dans les chapitres précédents les méthodes pour conserver des données dans une application (PreferedShared & SQLite). Le problème est que ces données ne sont pas partageables. Sous Android, seul l'application a accès à ses propres données stockées. Or, il y a de nombreux cas, où partager des données avec les autres applications est intéressant.
Android fournit une méthodologie particulière pour partager ces données, ce sont les fournisseurs de contenu.
Nous verrons que nativement Android en propose quelques uns, mais il est possible également pour le développeur de les créer. Et donc, par ce biais de proposer un service.
1)Accéder au fournisseur de contenu
1.1)Généralités
De plus en plus, il est nécessaire dans un monde ouvert de partager nos données. Ici, on agit alors comme un fournisseur de contenu, en anglais on parle de provider. L'objectif du fournisseur de contenu masque le format des données, seul le concepteur connait la structure.Android fournit une classe android.content.COnntentResolver pour accéder à ses fournisseurs de contenu.
Les URI, kézako? |
Donc de la forme : content://fr.doritique.provider/data/12
A noter que l'URI:
A noter qu'Android a des fournisseurs prédéfinis avec API qui définissent des constantes (exemple : ContactsContract.contacts.CONTENT_URI est l'URI de base pour les contacts ou Browser.BOOKMARK_URI pour les signets du navigateur).
Les fournisseurs sont des tableaux des données à partager avec en première colonne le champ _ID. Nous allons voir que la classe ContentResolver définit des méthodes pour accéder au fournisseur d'accès : query(), insert(), update() et delete(). Le retour de ces requêtes est renvoyé sous forme de Cursor que nous avons étudié au chapitre précédent avec SQLite.
1.2)Faire une sélection
Les fonctions sont très proches de celles vu avec la BDD SQLite. La méthode query() a un nom trompeur, car elle est utilisée pour réaliser un select SQL.Cursor query (Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) avec :
Nous allons voir un exemple d'usage de query en utilisant le fournisseur de contenu standard Brownser. L'objectif de notre exemple est de lister les favoris du Browser, appelé BookMark.
La prmière chose à faire est d'autoriser notre application à lire les favoris, de base c'est interdit sous Android. Pour cela il suffit de rajouter dans le fichier manifest la ligne suivante:
Pour le layout principal:
Pour personnaliser une ligne de la liste : row.xml
Le programme principal:
Ce qui donne:
1.3)Récupération d'une variable prédéfinie
Une seconde méthodologie pour récupérer la valeurs d'une variable connue, consiste à utiliser des méthodes setters existantes. Par exemple, l'identifiant _ID est souvent utilisé,alors:long varId=ContentUris.parseId(uri)
1.4)Modifier des données au travers du fournisseur de contenu
Les fournisseurs de contenus permettent l'accès aux données en lecture, mais aussi en écriture. Il est donc possible d'ajouter, de mettre à jour ou de supprimer des données. Commençons par l'ajout de données.Voici un exemple (qui fonctionne, pas facile avec une API qui ne cesse de changer...) pour ajouter un contact dans l'annuaire d'Android. Première chose à faire, il faut autoriser les modifications dans le fichier manifest.xml .
Ensuite, le fichier de l'activité principale:
Ce qui donne:
2)Créer son fournisseur de contenu
2.1)Les bases
Le framework Android permet également de construire ses propres fournisseurs de contenus. Deux cas d'utilisation en interne à l'application, ou externe pour permettre aux autres applications d’accéder à nos données.Comment faire cela:
Méthode à surcharger |
Définition de la méthode |
onCreate() | Cette méthode est appelée lors de la création du fournisseur de contenu, elle retourne un booléen pour signaler le succès ou non de l'opération, |
query() | Cette méthode permet de faire un select SQL, les données renvoyées sont transmises par l'intermédiaire d'un objet Cursor, |
delete() | Supprime un jeu de données, |
insert() | Insère des données, |
update() | Mise à jour de données, |
getType() | Donne un retour MIME. |
2.2)Exemple de mise en oeuvre
Le mieux comme toujours, c'est de proposer un exemple de code. Pour cela nous allons reprendre, l'application que nous avions réalisée avec SQLite dans laquel nous allons insérer notre provider que nous nommerons "monfournisseur".Pour la View, nous afficherons la liste des données de la base de données sans modifier le code, et nous nous contenterons simplement de faire une insertion par l’intermédiaire de notre fournisseur de contenu. A noter que nous avons choisis un exemple minimaliste car la mise en oeuvre devient très rapidement complexe et assez peu lisible.
Pour le layout principal:
Rappelons que pour l'utilisation de SQLite on utilise une classe d'adaption:
Sans oublier, la classe de de création de la base de données:
Mais tout cela est connu, voyons un peu la classe de création du provider monfournisseur.java . Vous noterez que la classe hérite de la classe mère ContentProvider. Ensuite, il suffit de surcharger les méthodes génériques du ContentProvider. Pour la fonction insert() dédiée à l'insertion, on utilise simplement une fonction savecomment2 de la classe adapter de la base de données. Nous avons fait simple, mais la beauté du concept, c'est que l'on peut faire à côté une multitude de truc en plus. Vu de nos utilisateurs il ne connaîtrons que la fonction insert().
Ensuite, il nous suffira de reprendre notre activité principale et de lui demander de faire une insertion en prenant soins d'utiliser notre fonction insert()!
Attention, il faut aussi penser à déclarer notre fournisseur de contenu dans le fichier manifest.xml:
Ce qui donne après plusieurs exécution de notre application:
Conclusion
Le fournisseur de contenu est un outil puissant car il permet de maîtriser les données transmises. Mais en créer un reste complexe et devra être testé afin de prévoir tous les cas d'utilisation...En outre, Android en propose plusieurs qui sont standards, ce qui est super pratique pour accéder aux datas du mobile (contacts, sites visités, historique des appels, listes des fichiers multi-média). Evidemment, il faudra faire attention à la confidentialités des données traitées...