Accès aux base de données distantes avec JSON

TP4 – Développement Android Dr. Yamen EL TOUATI www.yameneltouati.com
Accès aux base de données distantes avec JSON Objectifs 1. Syntaxe de JSON 2. Génération d’un fichhier JSON avec PHP 3. Parsing du fichier JSON depuis une application Android Notions à retenir Considérons la base de données suivante : CREATE DATABASE IF NOT EXISTS `example` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci; USE example; CREATE TABLE IF NOT EXISTS `name_table` ( `name` varchar(30) NOT NULL ); INSERT INTO `name_table` (`name`) VALUES ('name1'), ('name2'), ('name3'), ('samir'); Il est possible de récupérer les éléments de la table "name_table" depuis un fichier php de la façon suivante <?php // on se connecte à notre base pour récupérer les données $base = mysql_connect ('localhost', 'root', ''); mysql_select_db ('example', $base) ; $req =mysql_query("SELECT * from name_table"); while ($row=mysql_fetch_array($req)) { $output[]=$row; } //on encode en JSON print(json_encode($output)); mysql_free_result ($req); ?> Essayer de voir l’interprétation du fichier par le navigateur Web. Le script contient une première partie concernant l’accès à la base de données et la récupération des données. Ensuite, avec l’instruction Dr. Yamen EL TOUATI – Android Page 1
www.yameneltouati.com
print(json_encode($output)); On fait l’encodage JSON des résultats. L’aperçu du fichier est le suivant : {"0":"name1","name":"name1"},{"0":"name2","name":"name2"},{"0":"name3","name":"name3"},{"0":"samir","nam
e":"samir"}] Remarquez que chaque entrée est affichée deux fois, une avec son indice de colonne qui est ici 0 puisque c’est la première colonne (et la seule dans cet exemple), et une autre avec une clé d’identification qui est le nom de la colonne. La récupération de ces données dans un projet Android peut se faire de la façon suivante : package com.yameneltouati.conbddjson; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; import android.net.ParseException; import android.os.Bundle; import android.os.StrictMode; import android.util.Log; import android.widget.Toast; public class MainActivity extends Activity { String result = null; BufferedReader reader; StringBuilder sb; String line; HttpClient httpclient; // Création HTTP Post HttpPost httppost; HttpResponse response;// on envoie la requête HttpEntity entity; Dr. Yamen EL TOUATI – Android Page 2
www.yameneltouati.com
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (android.os.Build.VERSION.SDK_INT > 9) { StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder() .permitAll().build(); StrictMode.setThreadPolicy(policy); } // InputStream ‐> Flux d'entrée recevoir des données d'une source InputStream is = null; // Un JSONObject est un ensemble de couples nom/valeur non ordonnés. Il // commence par { (accolade gauche) et se termine par } (accolade // droite) JSONObject json_data = null; // On crée la liste qui contiendra tous nos paramètres ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); // On crée la liste qui contiendra tous nos données ArrayList<String> donnees = new ArrayList<String>(); // un gestionnaire d'exception try..catch // Il ne faut pas oublier que notre requête Http POST peut renvoyer des // exceptions, durant la construction ou l’envoi de la requête. C’est // pourquoi nous allons capter les exceptions suivantes: // java.io.IOException et org.apache.http.client.ClientProtocolException // , grâce a un try/catch. try { httpclient = new DefaultHttpClient(); httppost = new HttpPost("http://10.0.2.2/read_datas.php"); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); response = httpclient.execute(httppost);// on envoie la requête entity = response.getEntity(); is = entity.getContent(); } catch (Exception e) { Log.i("taghttppost", "" + e.toString()); } // //////////////////////////////////// // conversion de la réponse en chaine de caractère try { reader = new BufferedReader(new InputStreamReader(is, "UTF‐8")); Log.i("////// is", "" + is.toString()); sb = new StringBuilder(); line = null; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); Dr. Yamen EL TOUATI – Android Page 3
www.yameneltouati.com
} } is.close(); result = sb.toString(); } catch (Exception e) { Log.i("tagconvertstr", "" + e.toString()); } // recuperation des données json try { JSONArray jArray = new JSONArray(result); for (int i = 0; i < jArray.length(); i++) { json_data = jArray.getJSONObject(i); donnees.add(json_data.getString("name")); } for (String str : donnees){ Toast.makeText(this, str, Toast.LENGTH_SHORT).show(); } } catch (JSONException e) { Log.i("tagjsonexp", "" + e.toString()); } catch (ParseException e) { Log.i("tagjsonpars", "" + e.toString()); } } Il faut ajouter la permission android.permission.INTERNET dans le fichier AndroidManifest.xml pour pouvoir envoyer des requêtes http. Ceci se traduit par la balise <uses‐permission android:name="android.permission.INTERNET"/> Travail à faire Exercice 1 : Utiliser un layout linéaire pour afficher dessus une liste d’étudiants avec leurs moyennes. La liste des étudiants ainsi que leurs moyennes sera récupérée d’une base de donnée que vous allez concevoir. Exercice 2 : Reprendre l’exercice de l’affichage des Villes selon le choix des pays. Il faut maintenant que la liste des pays/villes soit récupérée d’une base de données que vous choisissez. Dr. Yamen EL TOUATI – Android Page 4
www.yameneltouati.com
Exercice 3 : Réaliser une application Android de deux activités (ACT1 et ACT2). ACT1 contient deux champs EditText pour login et mot de passe et un Bouton submit. La vérification du login et mot de passe se fait depuis une base de donnée. En cas d’échec un message d’erreur s’affiche sous forme d’un Toast. Le nombre de tentatives erronés maximal est de 5 après le bouton submit sera désactivée. En cas de réussite de connexion, l’activité ACT2 sera ouverte. Indice : il est possible d’envoyer un formulaire par la méthode GET avec une url indiquant les valeurs des différents attributs. Exercice 4 : Faite une application qui permet d’afficher de choisir un pays depuis un Spinner. La liste des pays est récupérée d’une base de données. On afficher par la suite la liste des villes dans ce pays. Ajouter dans cette application un EditText et un bouton pour ajouter une ville dans le pays. Dr. Yamen EL TOUATI – Android Page 5
www.yameneltouati.com