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 :

Impossible de récupérer des données SQL sur mon application Android


Sujet :

Android

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Impossible de récupérer des données SQL sur mon application Android
    Bonjour

    Je suis bloqué depuis plusieurs jours (voir plusieurs semaines) sur une erreur qui me tape sur les nerfs! Je ne pensais pas devoir demander de l'aide pour une erreur qui me paraît si insignifiante..
    Je n'ai jamais codé d'application Android auparavant, je me suis donc penché sur énormément de tutorial. L'application doit permettre à un utilisateur de se connecter avec ses identifiants, et d'afficher sur une nouvelle page des données d'une base de données.

    • Page de connexion Ok
    • Page qui affiche les données X


    Mon problème est qu'il n'affiche pas les données que je vais chercher dans une BD (par un fichier PHP) sur un Text View, Voici les messages d'erreur que j'ai récupéré dans les logs :

    01-29 13:33:55.995 886-886/com.example.fabien.tourderole E/log_tag﹕ Error in http connection android.os.NetworkOnMainThreadException
    01-29 13:33:55.995 886-886/com.example.fabien.tourderole E/log_tag﹕ Error converting result java.lang.NullPointerException: lock == null
    01-29 13:33:55.995 886-886/com.example.fabien.tourderole E/log_tag﹕ Error parsing data org.json.JSONException: End of input at character 0 of
    Vous trouverez ci-dessous en pièce jointe le code source de l'application, j’espère pouvoir trouver une réponse ici

    Merci
    Cordialement Fascoche
    Fichiers attachés Fichiers attachés

  2. #2
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Je me demande si dvp.net n'a pas un article sur la NetworkOnMainThread... faudra que je m'y colle si ce n'est pas le cas.

    Bon, cette exception indique tu as mis en place la mauvaise pratique consistant à réaliser une opération longue, et plus spécifiquement un appel réseau, sur le thread principal (aussi appelé thread graphique). Pour que l'expérience utilisateur soit optimale, il ne faut jamais que l'interface ne soit gelée, hors cette pratique la gèle justement. Ce point est valable quel que soit la plateforme ou le langage.

    Depuis Android 3.0 (Honeyomb), Android embarque une exception permettant de remonter ce problème. Tu es tombé dessus.

    Il faut donc que tu fasses ton opération longue dans un thread séparé.

    Documentation sur une solution possible (et simple à mettre en place) : http://developer.android.com/referen...AsyncTask.html

    La NPE provient de la NetworkOnMainThreadExpcetion, j'imagine.


    EDIT : voici le code mis en PJ par Fascoche pour une lecture facilitée

    Code Java : 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
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    package com.example.fabien.tourderole;
     
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import android.widget.TextView;
     
     
    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.apache.http.message.BasicNameValuePair;
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
     
    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
     
    public class Main extends Activity {
        private TextView tv;
        private TextView txt;
     
     
        public static final int RESULT_Main = 1;
     
        public void onCreate(Bundle icicle) {
            super.onCreate(icicle);
     
            //Appel de la page de Login
            startActivityForResult(new Intent(Main.this, Login.class), RESULT_Main);
            setContentView(R.layout.page_missions);
            txt = (TextView) findViewById(R.id.textView2);
            txt.setText(getServerData(strURL));
        }
        public static final String strURL = "Adresse URL DU FICHIER PHP QUI RECUPERE LES DONNEES SQL";
     
        private String getServerData(String returnString) {
            InputStream is = null;
            String result = "";
            // Envoyer la requête au script PHP.
            // Script PHP : $sql=mysql_query("select * from tblVille where Nom_ville like '".$_REQUEST['ville']."%'");
            // $_REQUEST['ville'] sera remplacé par L dans notre exemple.
            // Ce qui veut dire que la requête enverra les villes commençant par la lettre L
            ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
            nameValuePairs.add(new BasicNameValuePair("ville","Muret"));
     
            // 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: "+json_data.getInt("id")+
                                    ", NOM_COMMUNE: "+json_data.getString("NOM_COMMUNE")
                    );
                    // 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;
        }
    }
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Merci

    Pour ceux que ça intéresse, je vous laisse mon nouveau code qui fonctionne avec la méthode proposé par Hizin:

    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
    79
    80
    81
    82
    83
    84
    85
    86
    package com.example.fabien.tourderole;
     
    import android.app.Activity;
    import android.content.Intent;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.util.Log;
    import android.widget.TextView;
     
     
    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.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.message.BasicNameValuePair;
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
     
    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
     
    public class Main extends Activity {
        private TextView tv;
        private TextView txt;
     
     
        public static final int RESULT_Main = 1;
     
        public void onCreate(Bundle icicle) {
            super.onCreate(icicle);
     
            //Appel de la page de Login
            startActivityForResult(new Intent(Main.this, Login.class), RESULT_Main);
            setContentView(R.layout.page_missions);
            tv = (TextView) findViewById(R.id.textView);
            new GetData(tv).execute("");
        }
     
        private class GetData extends AsyncTask<String, Void, String> {
            private TextView display;
     
            GetData(TextView view){
                this.display = view;
            }
     
            @Override
            protected String doInBackground(String... message) {
                HttpClient httpclient;
                HttpGet request;
                HttpResponse response = null;
                String result = " ";
     
                try {
                    httpclient = new DefaultHttpClient();
                    request = new HttpGet("http://geotechnologie.fr/connexionbd.php");
                    response = httpclient.execute(request);
                }
                catch (Exception e) {
                    result = "error";
                }
     
                try {
                    BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
                    String line = "";
                    while ((line = rd.readLine()) != null)
                    {
                        result = result + line ;
                    }
                } catch (Exception e) {
                    result = "error";
                }
                return result;
            }
     
            protected void onPostExecute(String result) {
                this.display.setText(result);
            }
        }
    }
    J'aurai aussi aimé savoir si il était possible de récupérer des données dans plusieurs TextView mais seulement les données! Car maintenant quand je lance mon application, le textview m'affiche [{"id":"17","NOM_COMMUNE":"Muret"}], c'est bien la réponse que je demande mais pas sous cette forme.

    Merci

  4. #4
    Expert confirmé
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Points : 4 166
    Points
    4 166
    Par défaut
    Il te reste à "parser" le résultat (ici du JSON). Sinon, pourquoi avoir importé ceci ;-)
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Problème résolu! J'ai utilisé la méthode split pour récupérer les valeurs qui m’intéressaient.

    Merci pour votre aide !

Discussions similaires

  1. [MySQL] Récupérer des données sql
    Par klaskerchans dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 07/11/2013, 11h37
  2. Réponses: 1
    Dernier message: 01/10/2011, 13h27
  3. Réponses: 9
    Dernier message: 16/03/2010, 11h07
  4. Réponses: 1
    Dernier message: 14/02/2008, 10h10
  5. [VBA-W]récupérer des données SQL
    Par Taz_8626 dans le forum VBA Word
    Réponses: 2
    Dernier message: 15/03/2006, 09h46

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