2012-03-26 68 views
0

我试图获得从MySQL服务器发送和接收数据的Android应用程序的基础知识(我的实现与此学习示例无关)。这里是到目前为止的代码: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,您可以看到数据库确实正确响应了我在Android代码中链接的查询PHP文件,所以这不是问题。

编辑〜我应该注意到我的Activity之前的扩展列表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,它是最基本的。首先解决它。你用MySQL DB打到一个.php页面的事实在这一点上是一个问题。你甚至可能还没有发送SYN数据包...... – 2012-03-26 21:03:19

+0

你愿意澄清吗?我问及如何为此创建一个Asynctask ... – Davek804 2012-03-26 21:04:19

+0

对于异步,这看起来像一个地方开始:http://www.vogella.de/articles/AndroidPerformance/article.html特别是见第5节。 – 2012-03-27 13:40:34

回答

2

你如何运行你的数据库?发布PHP连接的方式可能更具相关性。在PHP中,您很可能没有将来自应用程序的请求连接到实际数据库(无论是使用不正确的url还是数据库本身的名称)。查看this教程。我可以确认它工作正常,它似乎也完成了您需要的功能。在该教程中,有关于更改代码的位置的注释,以便您可以在托管服务器而不是本地主机上运行它。

+0

查看最新的更新。 – Davek804 2012-03-26 20:59:50

+0

另外,感谢您的链接。一旦我掌握了这个基本方面,我将会使用它! – Davek804 2012-03-26 21:02:57

+0

KDEx,只是想让你知道,我重新创建了教程几乎信函复制粘贴。我改变的唯一的东西是本地主机IP地址到我的在线实际服务器。我在我的原始问题NetworkOnMainThreadException中遇到了同样的错误。有什么建议? – Davek804 2012-03-27 00:19:40