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.

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

报告相同问题?

悬赏问题

  • ¥50 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?