dtrphb5597 2012-03-26 20:38
浏览 169
已采纳

Android无法正确连接到MySQL数据库

I'm trying to get the basics of an Android app that sends and receives data from a MySQL server (my implementation will have nothing to do with this learning example). Here's the code so far:

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() + "
");

            String line="0";
            while ((line = reader.readLine()) != null) {
                sb.append(line + "
");
            }
            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();
        }
    }
}

And here's the code for the XML file '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>

And here are the LogCat problems I'm encountering:

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 obviously the network connection on main thread problem means I need to move this into an Asynctask, right? But with such a bevy of errors, I wonder if I am missing something else, that's obvious? I eventually want to be able to register user/passwords onto a database, then get queries and send responses, so this is just a warm up basically. If you goto http://www.davidjkelley.net/city.php you can see that the database is indeed properly responding to the query PHP file that I have linked inside the Android code, so that's not the problem.

Edit~ I should note that my Activity previously extended list Activity, following this tutorial: http://blog.sptechnolab.com/2011/02/10/android/android-connecting-to-mysql-using-php/ which is why my XML is just a ListView at the moment, because that helped clear up an error that said I needed a ListView component with the id 'list'.

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

Obviously the sets of stars are the correct information, as when you visited the link posted above, the SQL readout appears properly.

  • 写回答

1条回答

  • dssqq64884 2012-03-26 20:55
    关注

    How are your running your database? Posting how the PHP connects may be more relevant. It's very possible that in the PHP you aren't connecting the request from the app to the actual database (either with an incorrect url or the name of the database itself). Check out this tutorial. I can confirm it works fine and it seems to accomplish the functionality you need as well. In that tutorial there are notes on where to change the code so that you can run it on your hosted server instead of localhost.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 求解 yolo算法问题
  • ¥15 虚拟机打包apk出现错误
  • ¥30 最小化遗憾贪心算法上界
  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝