TP2 : Client d une BDD SqlServer Objectifs : utiliser la barre de menu, utiliser les préférences d application (settings) ou (options), gérer la persistance des données, utiliser la bibliothèque jtds:jdbc pour accéder à un serveur de base de données SqlServer, utiliser un Widget de type liste (ListView), gérer la rotation de la vue pour redessiner la vue, ça devrait suffire L application va consister à ajouter des «tuples» ou enregistrement à une table nommée F pour «Fournisseurs» d une base de données nommée Entreprise. Elle permettra également l affichage dans un contrôle de type «liste» de la liste des fournisseurs. Enfin un «clic long» sur un élément de la liste permettra la suppression du fournisseur sélectionné. La table F contient les champs suivants : un identificateur unique, numéro du fournisseur «NF», un nom de fournisseur «nomf», un statut «statut», un lieu de résidence «ville». Mise en place de l activité principale 1. Créer un nouveau projet Android Application nommé appclientsql, l application portera le nom du projet et le paquetage sera nommé net.votrenom.votreprénom.appclientsql : utiliser l API 12 comme sdk mini et l API 19 pour le développement, vous pouvez utiliser l icône fournie dans le dossier Android_Resources pour «agrémenter» votre application, conserver les noms par défaut de l activité (MainActivity.java) et du layout (activity_main.xml) générés. Voici le layout généré pour l activité principale ainsi créée, et celui que vous devez obtenir : TP2 : Client d une BDD SqlServer Page 1
Vous aurez reconnu en partant du haut : un contrôle de type «TextView» pour le titre de la vue, un contrôle de type «Button» qui servira à ajouter un fournisseur à la table F, 4 couples «TextView»/«EditText» pour éditer les données du fournisseur à ajouter, un contrôle de type «Button» qui servira à demander l affichage de la table des fournisseurs, un contrôle de type «TextView» pour le titre de la liste des fournisseurs, un contrôle de type «ListView» pour lister les fournisseurs. 2. A vous de jouer, faites en sorte d obtenir la vue présentée ci-dessus. Mise en place d une activité de «préférences» La vue de «préférences» permet de configurer les paramètres d application et de les rendre persistants afin qu il ne soit pas nécessaire de les spécifier à chaque lancement de l application. Généralement une valeur par défaut leur est attribuée pour le premier démarrage de l application. Sur Android cette vue ou activité est activée lorsque l application est active, en cliquant sur le bouton «settings» aussi appelé «options». Les activités de préférences doivent également être définies en XML, dans un dossier res/xml. Elles n utilisent pas les contrôles Widgets des activités «classiques» de l application, mais un jeu de balises spécifiques. Malheureusement, dans la version actuelle de l outil Eclipse-Android, il n y a pas de rendu visuel possible des activités de préférences. Les contrôles utilisables sont : PreferenceScreen : élément racine obligatoire de la hiérarchie de l activité des préférences, CheckBoxPreference : pour un contrôle case à cocher, DialogPreference : pour un contrôle du type boîte de dialogue, EditTextPreference : pour un contrôle du type zone d édition texte, MultiSelectListPreference : pour une liste de sélection multiple, PreferenceCategory : pour associer des contrôles dans un groupe avec un titre, RingTonePreference : pour le choix d une sonnerie, SwitchPreference : pour un contrôle commutateur. 3. Ajouter un dossier xml au dossier des ressources res et lui ajouter un fichier xml pour définir la vue des préférences, vous le nommerez userpreferences.xml (par exemple). 4. Compléter ce fichier afin d obtenir une vue telle que ci-dessous permettant de définir deux groupes ou catégories : un groupe pour les paramètres d adressage du serveur (adresse ip et port), un groupe pour les paramètres d authentification (nom d utilisateur et mot de passe). TP2 : Client d une BDD SqlServer Page 2
Compte tenu de l aspect (sans intérêt) de cette partie, un exemple de code XML correspondant vous est fourni dans un fichier preferences.xml du dossier Android_Resources. De même, les valeurs associées aux attributs XML de l exemple sont fournies dans un fichier stringspreferences.xml. 5. Ajouter une nouvelle classe java nommée PreferencesFragments à votre projet et faites la hériter de la classe PreferenceFragment. Coder cette classe afin qu elle charge les préférences définies dans le fichier XML et qu elle définisse les clés des attributs des préférences qui nous seront utiles pour relire les valeurs associées. 6. Ajouter une nouvelle classe java nommée SetPreferencesFragmentActivity à votre projet et faites la hériter de la classe Activity. Coder cette classe afin qu elle remplace l activité courante par le fragment des préférences. 7. Ajouter un menu options (ou settings) à votre activité principale, MainActivity, méthode Activity.onCreateOptionsMenu(). 8. Faites en sorte de capturer l événement sélection du menu options afin d afficher votre vue de préférences avec attente d un résultat en retour, méthode Activity.onOptionsItemSelected(). 9. Ajouter à votre classe MainActivity les données membres privées de type String suivantes pour stocker les valeurs définies via les préférences : ip : adresse ip du serveur SQL, port : port du serveur SQL, username : nom d utilisateur du compte SQL, password : mot de passe du compte SQL. 10. Faites en sorte de capturer le résultat retourné par la vue de préférences, méthode onactivityresult(). Cette méthode devra recopier les valeurs des attributs de préférences dans les attributs de la classe MainActivity. Il est conseillé pour cela de coder une méthode privée nommée updateattributsfrompreferences() car nous en aurons besoin par ailleurs. 11. Ajouter l appel à votre méthode updateattributsfrompreferences() dans la méthode oncreate() afin qu au chargement de l activité principale les attributs soient affectés avec les préférences persistantes. 12. Vérifier le bon fonctionnement de l ensemble. TP2 : Client d une BDD SqlServer Page 3
Codage d une classe métier pour accéder à la table F de la base Entreprise Pour vous mettre dans l ambiance, voici le diagramme de classe qu il faut coder Il est malade ou quoi!!! Pas de panique, la classe de droite fait partie d une bibliothèque «open source» fournie par «sourceforge.net». Cette bibliothèque fournit tout ce qu il faut pour se connecter à un serveur SQL et y effectuer des requêtes. La classe métier à développer est à gauche. Aller, je vous la donne De toute façon cela n apporterai rien puisque vous êtes sensé maitriser la programmation java. Si vous le souhaitez, vous pouvez cependant demander à avoir une petite présentation des fonctionnalités de cette classe 13. Ajouter la bibliothèque jtds :jdbc nommée jtds-1.2.8.jar à votre projet, vous la trouverez dans le dossier Android_Resources. 14. Ajouter la classe fournie ClientSQLmetier.java à votre projet. Vous la trouverez également dans le dossier Android_Resources. Et voilà, c en est terminé de la classe métier! Ajouter une ligne à la table F des fournisseurs Nous allons à présent utiliser la classe ClientSQLmetier pour ajouter un nouveau fournisseur à la table F. 15. Compléter le codage de la classe MainActivity afin de lui ajouter deux attributs privés pour les boutons «Ajouter un fournisseur» et «Lister les fournisseurs». TP2 : Client d une BDD SqlServer Page 4
16. Compléter le codage de la classe MainActivity afin de lui ajouter un attribut privé nommé clientbdd, objet de la classe ClientSQLmetier pour les accès à la BDD. 17. Compléter le codage de la classe MainActivity afin d instancier clientbdd avec les attributs initialisés par les préférences, une base de données nommée «Entreprise» et un time-out de connexion de 5s. 18. Compléter la méthode surchargée Activity.onCreate() afin : d initialiser les attributs précédents avec les références aux contrôles Widgets de l activité, d associer un écouteur sur le bouton «Ajouter un fournisseur» pour capturer l événement onclick et déclencher la méthode associée. 19. Coder la méthode onclick() afin qu elle ajoute le fournisseur à la BDD en utilisant la méthode addnewfournisseur(). Cette méthode retourne 1 en cas de succès et -1 autrement (si NF déjà utilisé par exemple). Afficher le résultat de l ajout dans une boîte de message de type AlertDialog. Rappel : L accès à la BDD passe par le réseau Il faut donc donner la permission nécessaire et faire en sorte que le code s exécute dans un «thread background», par exemple en utilisant la classe Thread (c.f. TP1!). 20. Vérifier le bon fonctionnement de l ensemble. Lister la table F des fournisseurs dans la «ListView» 21. Compléter la méthode surchargée Activity.onCreate() afin d associer un écouteur sur le bouton «Lister les fournisseurs» pour capturer l événement onclick et déclencher la méthode associée. 22. Coder la méthode onclick() afin qu elle affiche la liste des fournisseurs dans la ListView. On utilisera dans un premier temps un layout prédéfini du type «simple TextView», android.r.layout.simple_list_item_1. Il est conseillé de faire appel à une classe Fournisseur pour représenter les objets «Fournisseur», objets qui seront stockés dans un ArrayList des objets à lister. 23. Vérifier le bon fonctionnement de l ensemble. Personnaliser l item de la ListView Vous allez à présent réaliser un item personnalisé pour la liste des fournisseurs, cet item aura la structure et l allure suivantes : LinearLayout horizontal LinearLayout vertical LinearLayout horizontal TextView «nf» TextView «nomf» ImageView «imgusine» LinearLayout horizontal TextView «statut» TextView «ville» Le fichier XML correspondant item_perso.xml vous est fourni dans le dossier Android_Resources. Vous y trouverez également l image à associer au contrôle imageview nommée usine.jpg. TP2 : Client d une BDD SqlServer Page 5
24. Ajouter l image usine.jpg à votre projet et concevoir (ou récupérer) le layout item_perso.xml. 25. Coder une classe adaptateur personnalisée pour cet item que vous nommerez ArrayFournisseurAdapter héritant de la classe ArrayAdapter. 26. Modifier le code de votre activité afin de remplacer le layout prédéfini par votre layout personnalisé. 27. Vérifier le bon fonctionnement de l ensemble, ci-dessous l allure de la vue que vous devriez obtenir. Gérer la rotation de la vue Vous aurez remarqué qu une fois la liste affichée, si vous basculez votre matériel du mode «portait» au mode «paysage» ou inversement l affichage du contenu de la liste disparait En effet, lors de la rotation, l activité active est redessinée, la méthode Activity.onCreate() est appelée et redessine votre vue avec une liste vide. 28. Rendre votre classe Fournisseur «sérialisable». 29. Faire en sorte de gérer la persistance de la vue lors d une rotation du matériel. Supprimer un fournisseur suite à un «clic long» sur un élément de la liste On désire que lors d un clic prolongé sur un des items de la liste celui-ci soit supprimé et qu un message dans une «AlertDialog» nous signale la réussite ou l échec de la suppression. 30. Compléter la méthode surchargée Activity.onCreate afin d associer un écouteur sur l événement clic long sur un item de la liste setonitemlongclicklistener et déclencher la méthode associée onitemlongclick(). 31. Coder la méthode onitemlongclick() afin de supprimer le fournisseur sélectionné et signaler la réussite ou l échec de l opération dans une AlertDialog. Extension possible : prévenir de la suppression» La méthode retenue pour la suppression d un fournisseur est un peu brutale, elle ne prévient pas l utilisateur avant action Faire en sorte qu il soit demandé une confirmation de suppression suite à la détection du clic long avant de supprimer ou non le fournisseur sélectionné. TP2 : Client d une BDD SqlServer Page 6
Diagramme des classes Pour le plaisir des yeux, le diagramme des classes mises en place dans cette application. Sujet, ressources et corrigé : TP2 : Client d une BDD SqlServer Page 7