2012-03-26 1 views
0

Я пытаюсь получить основы Android-приложения, которое отправляет и получает данные с сервера MySQL (моя реализация не будет иметь ничего общего с этим примером обучения). Вот код до сих пор:Android не удается правильно подключиться к базе данных MySQL

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(); 
     } 
    } 
} 

А вот код для файла XML '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> 

А вот проблемы LogCat я сталкивающиеся:

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 

Таким образом, очевидно, что сетевое подключение по проблеме основного потока означает, что мне нужно переместить это в Asynctask, не так ли? Но с таким количеством ошибок, мне интересно, не хватает ли я чего-то другого, это очевидно? В конечном итоге я хочу иметь возможность регистрировать пользователя/пароли в базе данных, затем получать запросы и отправлять ответы, так что это просто разминка в основном. Если вы получили http://www.davidjkelley.net/city.php, вы можете видеть, что база данных действительно правильно отвечает на PHP-файл запроса, который я связал внутри Android-кода, так что это не проблема.

Редактировать ~ Я должен отметить, что моя активность ранее расширила список Activity, следуя этому руководству: http://blog.sptechnolab.com/2011/02/10/android/android-connecting-to-mysql-using-php/, поэтому мой XML - это просто ListView на данный момент, потому что это помогло устранить ошибку, в которой говорилось, что мне нужен компонент ListView с id 'list'.

Редактировать ~ Мой PHP код:

<?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(); 
?> 

Очевидно множества звезд правильной информации, как когда вы посетили ссылку размещенную выше, SQL считывание правильно отображается.

+0

Если вы получаете NetworkOnMainThreadException, это так же важно, как и оно. Исправьте это в первую очередь. Тот факт, что вы попадаете на страницу .php с помощью mysql DB, является побочной проблемой на этом этапе. Вероятно, вы даже не отправили пакет SYN ... –

+0

Не могли бы вы рассказать? Я спросил о том, как создать Asynctask для этого ... – Davek804

+0

Для async это похоже на одно место для запуска: http://www.vogella.de/articles/AndroidPerformance/article.html, в частности, см. Раздел 5. –

ответ

2

Как управлять своей базе данных? Публикация того, как соединяются PHP, может быть более актуальной. Очень возможно, что в PHP вы не подключаете запрос из приложения к фактической базе данных (либо с неправильным URL-адресом, либо с именем самой базы данных). Ознакомьтесь с учебным пособием this. Я могу подтвердить, что он работает нормально, и, похоже, он выполняет необходимую функциональность. В этом учебнике есть заметки о том, где можно изменить код, чтобы вы могли запускать его на своем размещенном сервере вместо localhost.

+0

Ознакомьтесь с последним обновлением. – Davek804

+0

Также, спасибо за ссылку. Я буду использовать это, как только у меня будет этот основной аспект под моим поясом! – Davek804

+0

KDEx, просто хотел сообщить вам, что я воссоздал этот учебник почти буква для письма с копией. Единственное, что я изменил, это локальный IP-адрес хоста для моего реального сервера в Интернете. Я получаю ту же ошибку, с которой сталкиваюсь в моем исходном вопросе, NetworkOnMainThreadException. Любой совет? – Davek804

Смежные вопросы