【问题标题】:Error when connecting to mySQL db from Android从 Android 连接到 mySQL db 时出错
【发布时间】:2012-04-01 01:17:34
【问题描述】:

我一直是following this tutorial。我一直非常小心地按照给出的说明进行操作。我所做的一切都与此人所做的相同,除了在我的 php 文件中我提供了我的主机、用户名、密码和数据库。在我的数据库中,我创建了与教程中完全相同的表(相同的字段类型名称,所有内容。我运行了相同的脚本),并且在 Eclipse 中有完全相同的代码。

这是我的代码。它与给出的相同,但我的 HttpPost 链接是我的。

package com.heatscore.pregame;

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.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.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class AlertsActivity extends Activity
{
    JSONArray jArray;
     String result = null;
     InputStream is = null;
     StringBuilder sb=null;


    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);

        // Uses the scores xml layout
        setContentView(R.layout.alerts);

        String result = "";
        ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
        nameValuePairs.add(new BasicNameValuePair("year","1980"));

        //http post
        try
        {
                HttpClient httpclient = new DefaultHttpClient();
                HttpPost httppost = new HttpPost("http://<EXCLUDED FOR QUESTION>/getAllPeopleBornAfter.php");
                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                HttpResponse response = httpclient.execute(httppost); 
                HttpEntity entity = response.getEntity();
                InputStream 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);
                StringBuilder sb = new StringBuilder();
                String line = null;
                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());
        }

        //parse json data
        try
        {
            JSONArray jArray = new JSONArray(result);
            for(int i=0;i<jArray.length();i++)
            {
                    JSONObject json_data = jArray.getJSONObject(i);
                    Log.i("log_tag","id: "+json_data.getInt("id")+
                            ", name: "+json_data.getString("name")+
                            ", sex: "+json_data.getInt("sex")+
                            ", birthyear: "+json_data.getInt("birthyear"));
            }
        }
        catch(JSONException e)
        {
                Log.e("log_tag", "Error parsing data "+e.toString());
        }
    }
}

不幸的是,当我运行我的应用程序时,LogCat 显示错误:

04-01 00:01:18.483: E/log_tag(5218): Error converting result java.lang.NullPointerException
04-01 00:01:18.483: E/log_tag(5218): Error parsing data org.json.JSONException: End of input at character 0 of 

我还为清单文件添加了正确的权限。是的,该行位于应用程序结束标记之后。

<uses-permission android:name="android.permission.INTERNET"/>

我 ping 主机以确保它不是网络问题。结果是成功的。此外,我在手机上运行该应用程序,而不是模拟器。程序没有崩溃,但是日志中有错误。

因此,如果几乎所有内容都与示例相同,那么为什么我的不工作?有没有其他人有这个问题,你做了什么?有没有办法解决这个问题?

【问题讨论】:

  • 更新:我认为我的 php 文件不是问题,因为当我浏览到服务器并单击该文件时,我得到以下输出:[{"id":"1","name ":"bob","sex":"1","birthyear":"1990"},{"id":"2","name":"sue","sex":"1","birthyear ":"1981"},{"id":"3","name":"mike","sex":"1","birthyear":"1989"}]
  • 更新:发现jArray的长度为0。 lblShow.setText(jArray.length() + "");不输出。而且,“结果”变量的值是一个空字符串。此外,while ((line = reader.readLine()) != null) 经历了 0 次迭代。
  • 你指的lblShow.setText(jArray.length() + "");在哪里?您能否再次验证您正在查询的 url 在浏览器中返回正确的 json 吗?也许这是帖子实体的问题?

标签: php android mysql json


【解决方案1】:

想通了! "is" 变量 (InputStream) 位于不同的 try catch 块中,并且在下一个块中为空。

以下代码修复了所有问题。请注意,我摆脱了一个 try catch 并将代码从它移到上一个。

希望这对某人有所帮助。

package xxx.xxx.xxx;

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.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.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class AlertsActivity extends Activity
{
JSONArray jArray;
String result;
InputStream is;
StringBuilder sb;

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

    String result = "";
    ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
    nameValuePairs.add(new BasicNameValuePair("year","1980"));

    //http post
    try
    {
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("http://xxx/getAllPeopleBornAfter.php");
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        HttpResponse response = httpclient.execute(httppost); 
        HttpEntity entity = response.getEntity();
        InputStream is = entity.getContent();

        BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) 
        {
            sb.append(line + "\n");
        }
        is.close();

        result=sb.toString();
    }
    catch(Exception e)
    {
        Log.e("log_tag", "Error in http connection " + e.toString());
    }

    //parse json data
    try
    {
        JSONArray jArray = new JSONArray(result);
        for(int i=0;i<jArray.length();i++)
        {
            JSONObject json_data = jArray.getJSONObject(i);
            Log.i("log_tag","id: " + json_data.getInt("id")+
                    ", name: " + json_data.getString("name")+
                    ", sex: " + json_data.getInt("sex")+
                    ", birthyear: " + json_data.getInt("birthyear"));    
        }
    }
    catch(JSONException e)
    {
        Log.e("log_tag", "Error parsing data " + e.toString());
    }
}
   }

【讨论】:

    猜你喜欢
    • 2014-09-22
    • 2020-10-19
    • 1970-01-01
    • 2021-06-28
    • 2012-01-24
    • 2022-11-08
    • 1970-01-01
    • 2021-07-21
    • 2016-08-04
    相关资源
    最近更新 更多