2012-03-26 5 views
0

Ich versuche, die Grundlagen einer Android-App zu erhalten, die Daten von einem MySQL-Server sendet und empfängt (meine Implementierung wird mit diesem Lernbeispiel nichts zu tun haben). Hier ist der Code so weit:Android kann keine Verbindung zur MySQL-Datenbank herstellen

package com.davekelley.polling; 

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.ParseException; 
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.ActionBar; 
import android.app.Activity; 
import android.app.ListActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.TextView; 
import android.widget.Toast; 

public class Chart extends Activity { 

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

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.chartfragment); 

     ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
     //http post 
     try{ 
      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost("http://www.davidjkelley.net/city.php"); 
      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()); 
     } 
     //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){ 
      Log.e("log_tag", "Error converting result "+e.toString()); 
     } 
     //paring data 
     int ct_id; 
     String ct_name; 
     try{ 
      jArray = new JSONArray(result); 
      JSONObject json_data=null; 
      for(int i=0;i<jArray.length();i++){ 
       json_data = jArray.getJSONObject(i); 
       ct_id=json_data.getInt("CITY_ID"); 
       ct_name=json_data.getString("CITY_NAME"); 
      } 
     } 
     catch(JSONException e1){ 
      Toast.makeText(getBaseContext(), "No City Found" ,Toast.LENGTH_LONG).show(); 
     } catch (ParseException e1) { 
      e1.printStackTrace(); 
     } 
    } 
} 

Und hier ist der Code für die XML-Datei 'chartfragment':

<?xml version="1.0" encoding="utf-8"?> 
    <ListView xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/list" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 

<!-- <LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/chartTitleTextView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceLarge" android:gravity="center"/> 
--> 

    </ListView> 

Und hier sind die LogCat Probleme Ich zu begegnen:

03-26 20:34:13.782: E/log_tag(1025): Error in http connection android.os.NetworkOnMainThreadException 
03-26 20:34:13.802: E/log_tag(1025): Error converting result java.lang.NullPointerException 
03-26 20:34:13.802: D/AndroidRuntime(1025): Shutting down VM 
03-26 20:34:13.802: W/dalvikvm(1025): threadid=1: thread exiting with uncaught exception (group=0x409c01f8) 
03-26 20:34:13.832: E/AndroidRuntime(1025): FATAL EXCEPTION: main 
03-26 20:34:13.832: E/AndroidRuntime(1025): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.davekelley.polling/com.davekelley.polling.Chart}: java.lang.NullPointerException 
03-26 20:34:13.832: E/AndroidRuntime(1025):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956) 
03-26 20:34:13.832: E/AndroidRuntime(1025):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
03-26 20:34:13.832: E/AndroidRuntime(1025):  at android.app.ActivityThread.access$600(ActivityThread.java:123) 
03-26 20:34:13.832: E/AndroidRuntime(1025):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
03-26 20:34:13.832: E/AndroidRuntime(1025):  at android.os.Handler.dispatchMessage(Handler.java:99) 
03-26 20:34:13.832: E/AndroidRuntime(1025):  at android.os.Looper.loop(Looper.java:137) 
03-26 20:34:13.832: E/AndroidRuntime(1025):  at android.app.ActivityThread.main(ActivityThread.java:4424) 
03-26 20:34:13.832: E/AndroidRuntime(1025):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-26 20:34:13.832: E/AndroidRuntime(1025):  at java.lang.reflect.Method.invoke(Method.java:511) 
03-26 20:34:13.832: E/AndroidRuntime(1025):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
03-26 20:34:13.832: E/AndroidRuntime(1025):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
03-26 20:34:13.832: E/AndroidRuntime(1025):  at dalvik.system.NativeStart.main(Native Method) 
03-26 20:34:13.832: E/AndroidRuntime(1025): Caused by: java.lang.NullPointerException 
03-26 20:34:13.832: E/AndroidRuntime(1025):  at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116) 
03-26 20:34:13.832: E/AndroidRuntime(1025):  at org.json.JSONTokener.nextValue(JSONTokener.java:94) 
03-26 20:34:13.832: E/AndroidRuntime(1025):  at org.json.JSONArray.<init>(JSONArray.java:87) 
03-26 20:34:13.832: E/AndroidRuntime(1025):  at org.json.JSONArray.<init>(JSONArray.java:103) 
03-26 20:34:13.832: E/AndroidRuntime(1025):  at com.davekelley.polling.Chart.onCreate(Chart.java:68) 
03-26 20:34:13.832: E/AndroidRuntime(1025):  at android.app.Activity.performCreate(Activity.java:4465) 
03-26 20:34:13.832: E/AndroidRuntime(1025):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
03-26 20:34:13.832: E/AndroidRuntime(1025):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 
03-26 20:34:13.832: E/AndroidRuntime(1025):  ... 11 more 

So offensichtlich die Netzwerkverbindung auf Hauptproblem Thread bedeutet, dass ich dies in eine Asynctask verschieben muss, oder? Aber mit solch einer Flut von Fehlern frage ich mich, ob ich etwas anderes vermisse, das ist offensichtlich? Ich möchte schließlich in der Lage sein, Benutzer/Passwörter auf einer Datenbank zu registrieren, dann Abfragen zu erhalten und Antworten zu senden, also ist dies im Grunde nur ein Warm-Up. Wenn Sie zu http://www.davidjkelley.net/city.php gehen, können Sie sehen, dass die Datenbank in der Tat richtig auf die Abfrage PHP-Datei reagiert, die ich innerhalb des Android-Codes verknüpft habe, so dass das nicht das Problem ist.

Bearbeiten ~ Ich sollte beachten, dass meine Aktivität zuvor Liste Aktivität, nach diesem Tutorial: http://blog.sptechnolab.com/2011/02/10/android/android-connecting-to-mysql-using-php/ aus diesem Grund meine XML ist nur ein ListView im Moment, weil das half, einen Fehler, der sagte, dass ich eine ListView-Komponente benötigt mit die ID 'Liste'.

bearbeiten ~ Mein PHP-Code:

<?php 
mysql_connect("127.0.0.1","***","***"); 
mysql_select_db("***"); 
$sql=mysql_query("select * from CITY where CITY_NAME like 'A%'"); 
while($row=mysql_fetch_assoc($sql)) 
$output[]=$row; 
print(json_encode($output)); 
mysql_close(); 
?> 

Offensichtlich sind die Sätze von Sternen sind die richtigen Informationen, wie wenn Sie auf den Link oben gepostet besucht, die SQL-Auslesung richtig erscheint.

+0

Wenn Sie NetworkOnMainThreadException bekommen, ist das so grundlegend wie es geht. Fix das zuerst. Die Tatsache, dass Sie eine .php-Seite mit mysql DB treffen, ist ein Nebenproblem an dieser Stelle. Sie haben wahrscheinlich nicht einmal ein SYN-Paket gesendet ... –

+0

Würdest du es gerne erklären? Ich fragte nach, wie man dafür auch eine Asynctask erstellen kann ... – Davek804

+0

Für asynchrone sieht das wie ein Ort aus: http://www.vogella.de/articles/AndroidPerformance/article.html insbesondere siehe Abschnitt 5. –

Antwort

2

Wie läuft Ihre Datenbank? Es kann relevanter sein, zu veröffentlichen, wie die PHP-Verbindung hergestellt wird. Es ist sehr wahrscheinlich, dass Sie in der PHP-Anwendung die Anfrage von der App nicht mit der tatsächlichen Datenbank verbinden (entweder mit einer falschen URL oder dem Namen der Datenbank selbst). Schauen Sie sich this Tutorial an. Ich kann bestätigen, es funktioniert gut und es scheint, um die Funktionalität zu erreichen, die Sie auch benötigen. In diesem Tutorial finden Sie Hinweise, wo Sie den Code ändern können, damit Sie ihn auf Ihrem gehosteten Server anstelle von localhost ausführen können.

+0

Überprüfen Sie das neueste Update. – Davek804

+0

Danke auch für den Link. Ich werde das benutzen, sobald ich diesen grundlegenden Aspekt unter meinem Gürtel habe! – Davek804

+0

KDEx, ich wollte Sie nur wissen lassen, dass ich dieses Tutorial fast mit Buchstaben für Buchstabe mit Kopie einfügen neu erstellt habe. Das einzige, was ich geändert habe, war die lokale Host-IP-Adresse meines aktuellen Servers online. Ich habe den gleichen Fehler, mit dem ich es in meiner ursprünglichen Frage, NetworkOnMainThreadException, zu tun habe. Irgendein Rat? – Davek804