IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Lecture requête MySQL


Sujet :

Android

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 338
    Par défaut Lecture requête MySQL
    Bonjour,

    Je débute avec android.

    Je veux afficher le résultat d'une requête dans mon application. Je n'ai pas d'erreur dans mon code quand je compile ou que je l'exécute.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    public class MainActivity extends Activity {
        TextView txt;  
     
     
    @Override
    public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);  
             setContentView(R.layout.main);  
             LinearLayout rootLayout = new LinearLayout(getApplicationContext());    
            // txt = new TextView(getApplicationContext());    
            // rootLayout.addView(txt);    
             setContentView(rootLayout);    
     
          //   txt.setText("Connexion...");   
     
      //  txt.setText(postData());   
      //  postData();
        // }  
     
       // public static final String strURL = "http://10.0.2.2/android/plat.php";  
       // public void postData() { 
            // On créé un client http
    	    HttpClient httpclient = new DefaultHttpClient();
    	    // On créé notre entête
    	    HttpPost httppost = new HttpPost("http://10.0.2.2/android/tablee/plat.php");
    	    try {
    	        // On ajoute nos données dans une liste
    	        List nameValuePairs = new ArrayList(6);
    	        // On ajoute nos valeurs ici un identifiant et un message
    	        nameValuePairs.add(new BasicNameValuePair("test", "hu"));
    	        nameValuePairs.add(new BasicNameValuePair("message", "Android c'est coo!!!"));
    	        // Ajoute la liste à notre entête
    	        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    	        // On exécute la requête tout en récupérant la réponse
    	        HttpResponse response = httpclient.execute(httppost);
    	        // On peut maintenant afficher la réponse
    	        Log.e("http réponse",response.toString());
    	    } catch (ClientProtocolException e) {
    	        // TODO Auto-generated catch block
    	    } catch (IOException e) {
    	        // TODO Auto-generated catch block
    	    }
    }
    }
    Quand je lance mon application rien ne s'affiche.

    Voici mon fichier plat.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php	
    		mysql_connect("localhost","","");  
      mysql_select_db("plat");  
      $sql=mysql_query("SELECT * FROM plat");  
     while($row=mysql_fetch_assoc($sql))  
     $output[]=$row;  
     print(json_encode($output));  
     mysql_close();
    ?>
    Si dans ma machine je vais sur internet est je tape : http://10.0.2.2/android/plat.php , mon fichier fonctionne.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 8
    Par défaut
    Dans ton manifest as-tu bien ajouté la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     <uses-permission android:name="android.permission.INTERNET"></uses-permission>

  3. #3
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par xouzi Voir le message
    Je n'ai pas d'erreur dans mon code quand je compile ou que je l'exécute.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class MainActivity extends Activity {
        ...
    	    } catch (ClientProtocolException e) {
    	        // TODO Auto-generated catch block
    	    } catch (IOException e) {
    	        // TODO Auto-generated catch block
    	    }
    Il faut dire que tu passe sous silence un paquet d'erreurs.... Quand une exception est catchée et "disposée" (non "transmise" directement ou indirectement par un autre throw), il faut *toujours* faire un log... Le niveau du log indiquant l'importance de l'erreur (perso j'utilise cette échelle: error=met en peril le fonctionnement de l'app, warn=erreur inattendue mais récupérable, info=erreur qui peut arriver et traitée comme il se doit). Déjà, ca te donnera des infos si tu passes dans ces cas là...

    Ensuite, le resultat... je ne suis pas sur que ce soit response.toString() !!!
    La conversion des données recues par HTTP en string ressemble plutot à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    String entityToString(HttpEntity entity) throws IllegalStateException, IOException
    {
            InputStream ips  = entity.getContent(); 
            BufferedReader buf = new BufferedReader(new InputStreamReader(ips,charset)); 
            StringBuilder sb = new StringBuilder(); 
            String s; 
            while(true ) 
            { 
                s = buf.readLine(); 
                if(s==null || s.length()==0) 
                    break; 
                sb.append(s); 
     
            } 
            buf.close(); 
            ips.close(); 
            return sb.toString(); 
    }
    à appeler avec entityToString(response.getEntity()) bien sur

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 338
    Par défaut
    Non je n'avais pas mi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    mais sa ne fonctionne toujours pas et lorsque je lance mon application sur la machine j'ai un message d'erreur.

    Il me manque surement une configuration non ?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    542
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 542
    Par défaut
    peux tu nous indiquer ton message d'erreur?

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 338
    Par défaut
    Alors j'ai plus de message d'erreur.
    Mais rien ne s'affiche dans mon application.

    Manifest.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.ha.test"
          android:versionCode="1"
          android:versionName="1.0">
        <application android:label="@string/app_name" >
            <activity android:name="MainActivity"
                      android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
         <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    </manifest>
    Quand j'execute ma page plat.php dans mon local. je récupère:
    [{"ID":"5","TYPE":"0","LIBELLE":"tes","TARIF":"16","ID_LIEU":"0","ING":"es"},{"ID":"4","TYPE":"2","LIBELLE":"plat","TARIF":"14","ID_LIEU":"1","ING":"test"},{"ID":"6","TYPE":"0","LIBELLE":"tes","TARIF":"16","ID_LIEU":"0","ING":"es"},{"ID":"7","TYPE":"0","LIBELLE":"dsd","TARIF":"14","ID_LIEU":"0","ING":"dsd"}]

  7. #7
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    As tu bien mis les log comme je t'ai dis ?

    Que dit le LogCat ?

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 338
    Par défaut
    Voila ce que j'ai écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
     
     
    public class MainActivity extends Activity {
        TextView txt;  
     
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);  
             setContentView(R.layout.main);  
             LinearLayout rootLayout = new LinearLayout(getApplicationContext());    
            // txt = new TextView(getApplicationContext());    
            // rootLayout.addView(txt);    
             setContentView(rootLayout);    
     
          //   txt.setText("Connexion...");   
     
      //  txt.setText(postData());   
      //  postData();
        // }  
     
       // public static final String strURL = "http://10.0.2.2/android/tab/plat.php";  
       // public void postData() { 
            // On créé un client http
    	    HttpClient httpclient = new DefaultHttpClient();
    	    // On créé notre entête
    	    HttpPost httppost = new HttpPost("http://10.0.2.2/android/tab/plat.php");
    	    try {
    	        // On ajoute nos données dans une liste
    	        List nameValuePairs = new ArrayList(6);
    	        // On ajoute nos valeurs ici un identifiant et un message
    	        //nameValuePairs.add(new BasicNameValuePair("test", "hu"));
    	        //nameValuePairs.add(new BasicNameValuePair("message", "Android c'est coo!!!"));
    	        // Ajoute la liste à notre entête
    	       // httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    	        // On exécute la requête tout en récupérant la réponse
    	        HttpResponse response = httpclient.execute(httppost);
    	        // On peut maintenant afficher la réponse
                  // String  reponse ="cool";
     
     
    	        Log.e("http réponse",response.toString());
     
     
     
    	    } catch (ClientProtocolException e) {
    	     Log.d("ClientProtocolException", ""+e);
                    //    e.printStackTrace();
     
    	    } catch (IOException e) {
    	        // TODO Auto-generated catch block
                     Log.d("IOException", ""+e);
                       // e.printStackTrace();
     
    	    }
    }
     
     
     
     
    }
    Ce que je vois dans Android Developpement :
    Package Tablee-debug.apk deployed
    Starting activity com.a2h.test.MainActivity on device emulator-5554
    Unresponsive shell when executing am start -n com.ha.test/com.ha.test.MainActivity -a android.intent.action.MAIN -c android.intent.category.LAUNCHER on emulator-5554
    Ce n'était peut être pas sa que tu attendais non?

  9. #9
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    En fait... log.d/w/e utilisent un truc plus simple:

    Log.#(TAG,MSG,EXCEPTION)

    TAG = Tag unique pour ton application (tu peux filtrer par TAG ensuite)
    MSG = Le message à afficher
    EXCEPTION = Optionel: L'exception (si il y en a une): Ca évite d'avoir à faire (""+e) pour passer l'exception en string (d'ailleurs, il vaut mieux faire e.toString() .... ca évite un string-builder).

    Donc: Log.i("MonAppli","Résultat: "+ monResultat), ou Log.e("MonAppli","IOError !",e);


    Sinon... J'ai peur que ton appli ne se fasse tuer avant même d'avoir un résultat... Faire un call "http" à l'interieur du thread d'UI est souvent puni par un Non Responsive Application error... Je ne sais même pas si à partir de la 3.0 c'est pas directement detecté et refusé !

    Sous Eclipse, dans la perspective "DDMS", tu devrai voir ton "device", et en cliquant dessus l'ensemble des logs associés dans une fenetre similaire à la console qui s'appelle "LogCat", c'est là ou vont tous les logs...

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 338
    Par défaut
    Alors je suis passée sous eclipse.

    code tabactivity.java:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    public class TabActivity extends Activity {
        /** Called when the activity is first created. */
        //@Override
        TextView txt;
     
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
     
     
            LinearLayout rootLayout = new LinearLayout(getApplicationContext()); 
            	        txt = new TextView(getApplicationContext()); 
            	        rootLayout.addView(txt); 
            	        setContentView(rootLayout); 
     
            	        // Définir le texte et appeler la fonction de connexion. 
            	        txt.setText("Connexion...");
            	        // Appeler la méthode pour récupérer les données JSON
            	        txt.setText(getServerData(strURL));
            	    }
     
            	    // Mettre l'adresse du script PHP
            	    // Attention localhost ou 127.0.0.1 ne fonctionnent pas. Mettre l'adresse IP local.
            	    public static final String strURL = "http://10.0.2.2/plat.php";
     
            	    private String getServerData(String returnString) {
            	        InputStream is = null;
            	        String result = "";
            	        // Envoyer la requête au script PHP.
     
            	        ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
            	        nameValuePairs.add(new BasicNameValuePair("",""));
     
            	        // Envoie de la commande http
            	        try{
            	            HttpClient httpclient = new DefaultHttpClient();
            	            HttpPost httppost = new HttpPost(strURL);
            	            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            	            HttpResponse response = httpclient.execute(httppost);
            	            HttpEntity entity = response.getEntity();
            	            is = entity.getContent();
     
            	        }catch(Exception e){
            	            Log.e("log_tag", "Error in http connection " + e.toString());
            	        }
     
            	        // Convertion de la requête en string
            	        try{
            	            BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
            	            StringBuilder sb = new StringBuilder();
            	            String line = null;
            	            while ((line = reader.readLine()) != null) {
            	                sb.append(line + "\n");
           	            }
            	            is.close();
            	            result=sb.toString();
            	        }catch(Exception e){
            	            Log.e("log_tag", "Error converting result " + e.toString());
            	        }
            	        // Parse les données JSON
            	        try{
            	           JSONArray jArray = new JSONArray(result);
            	            for(int i=0;i<jArray.length();i++){
           	                JSONObject json_data = jArray.getJSONObject(i);
            	                // Affichage ID_ville et Nom_ville dans le LogCat
            	                Log.i("log_tag","ID_ville: "+json_data.getInt("ID_ville")+
            	                        ", Nom_ville: "+json_data.getString("Nom_ville")
           	                );
            	                // Résultats de la requête
            	                returnString += "\n\t" + jArray.getJSONObject(i);
           	            }
            	        }catch(JSONException e){
            	            Log.e("log_tag", "Error parsing data " + e.toString());
            	        }
            	        return returnString;
            	    }
            	}
    Manifest :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="fr.a2h.tablee"
        android:versionCode="1"
        android:versionName="1.0" >
     
        <uses-sdk android:minSdkVersion="14" />
     
        <application
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name" 
            android:theme="@style/MonSuperTheme" android:permission="android.permission.INTERNET">
            <activity
                android:label="@string/app_name"
                android:name=".TableeActivity" >
                <intent-filter >
                    <action android:name="android.intent.action.MAIN" />
     
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    </manifest>
    Erreur :
    11-16 14:07:20.946: E/log_tag(563): Error in http connection android.os.NetworkOnMainThreadException
    11-16 14:07:20.956: E/log_tag(563): Error converting result java.lang.NullPointerException
    11-16 14:07:20.966: E/log_tag(563): Error parsing data org.json.JSONException: End of input at character 0 of

    Maintenant si je vais tester mon fichier php dans ma machine je n'ai pas accès.

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 338
    Par défaut
    Pour mettre les permissions pour internet j'ai utilisé ce tuto (p60) : http://www.isima.fr/~lacomme/DevPort...al_android.pdf

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 338
    Par défaut
    Est ce que j'ai besoin d'importer des librairies?

  13. #13
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par xouzi Voir le message
    Erreur :
    11-16 14:07:20.946: E/log_tag(563): Error in http connection android.os.NetworkOnMainThreadException
    11-16 14:07:20.956: E/log_tag(563): Error converting result java.lang.NullPointerException
    11-16 14:07:20.966: E/log_tag(563): Error parsing data org.json.JSONException: End of input at character 0 of
    Ben voila, tu as ta réponse: comme je le supputais, Android refuse que tu fasses une connection réseau dans le main thread de l'application (UI)... Il te faut passer par un thread à part (il existe plusieurs méthodes pour cela, cherches "ASync" sur dev.android). Bon... sans cette erreur directe, tu aurais eu un "Application Ne Répond Pas" sur n'importe quel device un tant soit peu rapide...

    Comme tu n'as pas de 'InputStream' ... tout le reste échoue....

    Mais encore une fois, au lieu de faire Log.e("Log_cat","Error dans ceci: "+e.toString()) fait jutse Log.e("Log_cat","Error dans ceci",e); non seulement tu auras l'exception complete, mais qui l'a lancé dans quelle condition pour quelle raison, ....

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 338
    Par défaut
    est c'est normal si je n'arrive pas avoir mon fichier php dans ma machine ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requète MySQL >> Postgresql
    Par genova dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 19/08/2005, 09h05
  2. Requête MYSQL LIKE particulière
    Par TheDarkLewis dans le forum Requêtes
    Réponses: 9
    Dernier message: 05/12/2004, 15h50
  3. Arrêt de l'exécution d'une requête MySQL dans DELPHI.
    Par joelmarc dans le forum Bases de données
    Réponses: 9
    Dernier message: 11/10/2004, 16h11
  4. surcharge de requête MySQL
    Par simoryl dans le forum Requêtes
    Réponses: 4
    Dernier message: 15/06/2004, 10h43
  5. requête mysql sous php
    Par remi59 dans le forum Débuter
    Réponses: 9
    Dernier message: 03/07/2003, 10h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo