2012-10-24 6 views
-1

Je suis nouveau sur Android et je voudrais créer une application qui lit les données du serveur mysql. I've taken from web an example about this, mais je ne peux pas le faire fonctionnerAndroid se connecter à mysql via php

J'utilise eclipse pour cela et pour l'autre partie, php et mysql. Tout d'abord, voici mon script php qui exécute ok (city.php):

<?php 
//connecting to database 
$sql=mysql_query("select * from city"); 
$output = array(); 
while(list($id,$name)=mysql_fetch_array($sql)){ 
    $output[$id]=$name; 

} 
print(json_encode($output)); 
mysql_free_result($sql); 

?> 

Ce retourne:

{"1":"Brasov","2":"Bucuresti"} 

Sur mon projet Android de l'éclipse, j'ai dans le MainActivity.java :

package com.example.mycity; 


import android.os.Bundle; 
import android.app.Activity; 


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.net.ParseException; 
import android.util.Log; 
import android.widget.Toast; 

public class MainActivity extends Activity { 

JSONArray jArray; 
String result = null; 
InputStream is = null; 
StringBuilder sb=null; 

@Override 
public void onCreate(Bundle savedInstanceState) { 


super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 

ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
//http post 
try{ 
    HttpClient httpclient = new DefaultHttpClient(); 
    HttpPost httppost = new HttpPost("http://www.steagu.ro/android/city.php"); 
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
    HttpResponse response = httpclient.execute(httppost); 
    if (response.getStatusLine().getStatusCode() != 200) { 
      Log.d("MyApp", "Server encountered an error."); 

    } 
    HttpEntity entity = response.getEntity(); 
    is = entity.getContent(); 
    }catch(Exception e){ 
     //e.printStackTrace(); 
     Log.e("log_tag", "Error in http connection: "+e.toString()); 
    } 

    } 


} 

Mais quand je suis en cours d'exécution, je reçois une erreur sur logcat: il n'est pas la connexion au fichier: erreur dans la connexion http: android.os.NetworkOnMainThreadExce ption

10-24 13:04:34.429: I/dalvikvm(982): threadid=3: reacting to signal 3 
10-24 13:04:34.649: I/dalvikvm(982): Wrote stack traces to '/data/anr/traces.txt' 
10-24 13:04:34.859: E/log_tag(982): Error in http connection: android.os.NetworkOnMainThreadException 
10-24 13:04:34.919: I/dalvikvm(982): threadid=3: reacting to signal 3 
10-24 13:04:34.949: I/dalvikvm(982): Wrote stack traces to '/data/anr/traces.txt' 
10-24 13:04:35.151: D/gralloc_goldfish(982): Emulator without GPU emulation detected. 
10-24 13:04:35.479: I/dalvikvm(982): threadid=3: reacting to signal 3 
10-24 13:04:35.499: I/dalvikvm(982): Wrote stack traces to '/data/anr/traces.txt' 

J'ai la permission d'Internet dans le AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.mycity" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="15" /> 
<uses-permission android:name="android.permission.INTERNET"></uses-permission> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name=".MainActivity" 
      android:label="@string/title_activity_main" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

Je ne sais pas où est le problème. Quelqu'un peut-il m'aider avec ça? Je vous remercie!

+0

Avez-vous vérifié que votre Internet fonctionne dans votre émulateur? – Antarix

+0

Salut Antarix, oui, la connexion internet fonctionne bien dans l'émulateur. –

Répondre

0

Vous pouvez utiliser une classe AsyncTask pour réaliser vos opérations de réseau en tant que StrictMode ne permet pas de se faire sur le principal exemple de l'interface utilisateur comme suit

  public class MainActivity extends Activity { 

     JSONArray jArray; 
     String result = null; 
     InputStream is = null; 
      StringBuilder sb=null; 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 


     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     new httpRequest().execute(); 

     } 


     private class httprRequest extends AsyncTask<String, Integer, String>{ 

       @override 
       public String doInBackground(String.... params){ 
        ArrayList<NameValuePair> nameValuePairs = new    ArrayList<NameValuePair>(); 
     //http post 
      try{ 
      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost("http://www.steagu.ro/android/city.php"); 
      httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
      HttpResponse response = httpclient.execute(httppost); 
      if (response.getStatusLine().getStatusCode() != 200) { 
       Log.d("MyApp", "Server encountered an error."); 

       } 
      HttpEntity entity = response.getEntity(); 
      is = entity.getContent(); 
      }catch(Exception e){ 
      //e.printStackTrace(); 
      Log.e("log_tag", "Error in http connection: "+e.toString()); 
      } 

       } 
       } 

      } 
     } 
+0

Merci, ça a marché! Mais maintenant j'ai des problèmes pour récupérer les informations ... –

+0

afin de corriger la nouvelle erreur que votre réception change cette ligne dans la méthode onCreate. new httpRequest(). execute(); à résultat = nouveau httpRequest(). Execute(). Get; Cela devrait corriger vos erreurs faites le moi savoir dans un autre commentaire ou une nouvelle question. :) – kabuto178

+0

Thnak vous, ça marche! Mais cela devrait être mis dans un try-catch, parce que sinon c'est donner une erreur.donc le code est comme ceci: try { result = new httprRequest(). execute(). get(); } catch (Exception e) {} int ct_id = 0; String ct_name = ""; // attendre d'avoir les données contenues dans la variable alors que (résultat == null) { \t Toast.makeText (getBaseContext(), "Connexion ...", Toast.LENGTH_LONG) .show(); \t} –

0

Le problème est le suivant:

10-24 13:04:34.859: E/log_tag(982): Error in http connection: 
        android.os.NetworkOnMainThreadException 

Vous devez faire votre accès au réseau sur un thread différent.

-1

Merci kabuto178, je suis fait les changements et c'est la connexion. Je l'ai écrit aussi le code pour récupérer des données de MySQL, donc qui en ont besoin, puis utiliser mon exemple

Voici le code:

package com.example.mycity; 


import android.os.AsyncTask; 
import android.os.Bundle; 
import android.app.Activity; 


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.net.ParseException; 
import android.util.Log; 
import android.widget.TextView; 
import android.widget.Toast; 

public class MainActivity extends Activity { 

String result = ""; 
InputStream is = null; 
StringBuilder sb=null; 
//String ct_name = null; 

@Override 
public void onCreate(Bundle savedInstanceState) { 


super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 
new httprRequest().execute(); 


int ct_id=0; 
String ct_name=""; 

//Toast.makeText(getBaseContext(), "This is "+result, 3000).show(); 

try { 
Thread.sleep(1000L); 
} catch (Exception te) {} 

try{ 
    //ct_name = result; 
    JSONArray jArray = new JSONArray(result); 

    for(int i=0;i<jArray.length();i++){ 
      JSONObject json_data= jArray.getJSONObject(i); 
      ct_id=json_data.getInt("CITY_ID"); 
      ct_name += json_data.getString("CITY_NAME")+":"; 
     } 

    } 
    catch(JSONException e1){ 
     e1.printStackTrace(); 
    } catch (ParseException e1) { 
      e1.printStackTrace(); 
    } 

TextView tv1 = (TextView) findViewById(R.id.textView1); 
tv1.setText(ct_name); 

} 

private class httprRequest extends AsyncTask<String, Integer, String>{ 

    @Override 
    public String doInBackground(String... params){ 
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
//http post 
try{ 
HttpClient httpclient = new DefaultHttpClient(); 
HttpPost httppost = new HttpPost("http://www.steagu.ro/android/city.php"); 
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
HttpResponse response = httpclient.execute(httppost); 
if (response.getStatusLine().getStatusCode() != 200) { 
    Log.d("MyApp", "Server encountered an error."); 

    } 
HttpEntity entity = response.getEntity(); 
is = entity.getContent(); 
}catch(Exception e){ 
//e.printStackTrace(); 
Log.e("log_tag", "Error in http connection: "+e.toString()); 
} 

//convert response to string 

try{ 
     BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); 
     sb = new StringBuilder(); 
     sb.append(reader.readLine() + "\n"); 

     String line="0"; 
     while ((line = reader.readLine()) != null) { 
         sb.append(line + "\n"); 
     } 
     is.close(); 
     result=sb.toString(); 
}catch(Exception e){ 
     //Toast.makeText(getBaseContext(), "Am eroare aici", 3000).show(); 
     Log.e("log_tag", "Error converting result "+e.toString()); 
} 


/* 
Toast.makeText(getBaseContext(), "Here i am", 3000).show(); 
*/ 

return result; 
    } 

    } 

} 

Je dois changer un peu le code, parce que je mettre un thread.sleep. Au lieu de cela, je dois vérifier si j'ai une valeur dans le résultat (dans une boucle while). Je pense que cela se produit parce qu'à ce moment-là, lorsque j'essaie d'analyser la valeur, je n'ai pas de valeur dans le résultat.

Le code php est:

<?php 
//connecting to database 
$sql=mysql_query("select * from city where CITY_NAME like '%'"); 
$output = array(); 
while($row=mysql_fetch_assoc($sql)){ 
    $output[]=$row; 
} 

echo json_encode($output); 
mysql_free_result($sql); 

?> 

Table 'ville' a deux colonnes, CITY_ID et CITY_NAME.