2015-02-05 94 views
0

嗨,我是新手到android。我试图android来连接mysql。 我已经写了PHP文件。它运作良好。 但我不知道如何连接到MySQL以及。Android连接到Mysql的棒棒糖

我做了readDB.php和writeDB.php。 android的SendPost类使用writeDB.php和phpDown类使用readDB.php

当我运行此屏幕出现短时间和'不幸测试已停止'按摩出现。

下面是logcat的错误信息。

02-05 16:03:16.233: E/AndroidRuntime(3188): FATAL EXCEPTION: main 
02-05 16:03:16.233: E/AndroidRuntime(3188): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 
02-05 16:03:16.233: E/AndroidRuntime(3188):  at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251) 
02-05 16:03:16.233: E/AndroidRuntime(3188):  at java.util.ArrayList.get(ArrayList.java:304) 
02-05 16:03:16.233: E/AndroidRuntime(3188):  at com.example.test.MainActivity$phpDown.onPostExecute(MainActivity.java:146) 
02-05 16:03:16.233: E/AndroidRuntime(3188):  at com.example.test.MainActivity$phpDown.onPostExecute(MainActivity.java:1) 
02-05 16:03:16.233: E/AndroidRuntime(3188):  at android.os.AsyncTask.finish(AsyncTask.java:602) 
02-05 16:03:16.233: E/AndroidRuntime(3188):  at android.os.AsyncTask.access$600(AsyncTask.java:156) 
02-05 16:03:16.233: E/AndroidRuntime(3188):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615) 
02-05 16:03:16.233: E/AndroidRuntime(3188):  at android.os.Handler.dispatchMessage(Handler.java:99) 
02-05 16:03:16.233: E/AndroidRuntime(3188):  at android.os.Looper.loop(Looper.java:137) 
02-05 16:03:16.233: E/AndroidRuntime(3188):  at android.app.ActivityThread.main(ActivityThread.java:4512) 
02-05 16:03:16.233: E/AndroidRuntime(3188):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-05 16:03:16.233: E/AndroidRuntime(3188):  at java.lang.reflect.Method.invoke(Method.java:511) 
02-05 16:03:16.233: E/AndroidRuntime(3188):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794) 
02-05 16:03:16.233: E/AndroidRuntime(3188):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:561) 
02-05 16:03:16.233: E/AndroidRuntime(3188):  at dalvik.system.NativeStart.main(Native Method) 

这是源代码。

package com.example.test; 

    import java.io.*; 
    import java.net.HttpURLConnection; 
    import java.net.URL; 
    import java.util.*; 

    import android.app.*; 
    import android.os.*; 
    import android.widget.*; 
    import android.view.*; 

    import org.apache.http.NameValuePair; 
    import org.apache.http.client.ClientProtocolException; 
    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.apache.http.params.HttpConnectionParams; 
    import org.apache.http.params.HttpParams; 
    import org.apache.http.util.EntityUtils; 
    import org.json.JSONArray; 
    import org.json.JSONException; 
    import org.json.JSONObject; 

    public class MainActivity extends Activity { 
     TextView txtView; 
     phpDown task; 
     ArrayList<ListItem> listItem= new ArrayList<ListItem>(); 
     String number = null; 
     String passwords = null; 
     Button button; 

     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 

      task = new phpDown(); 
      txtView = (TextView) findViewById(R.id.txtView); 
      button = (Button)findViewById(R.id.submitBtn); 

      task.execute("http://203.255.70.229/readDB.php"); 

      button.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View v) { 
        String number_edit = ((EditText)findViewById(R.id.number)).getText().toString(); 
        String passwords_edit = ((EditText)findViewById(R.id.passwords)).getText().toString(); 

        number = number_edit; 
        passwords = passwords_edit; 

        new SendPost().execute(); 
       } 
      }); 
     } 

     private class SendPost extends AsyncTask<Void, Void, String> { 
      protected String doInBackground(Void... unused) { 
       String content = executeClient(); 
       return content; 
      } 

      public String executeClient() { 
       ArrayList<NameValuePair> post = new ArrayList<NameValuePair>(); 
       post.add(new BasicNameValuePair("number", number)); 
       post.add(new BasicNameValuePair("passwords", passwords)); 

       HttpClient client = new DefaultHttpClient(); 

       HttpParams params = client.getParams(); 
       HttpConnectionParams.setConnectionTimeout(params, 5000); 
       HttpConnectionParams.setSoTimeout(params, 5000); //setSoTimeout? 
       // Post객체 생성 
       HttpPost httpPost = new HttpPost("http://203.255.70.229/writeDB.php"); 

       try { 
        UrlEncodedFormEntity entity = new UrlEncodedFormEntity(post,"UTF-8"); 
        httpPost.setEntity(entity); 
        client.execute(httpPost); 
        return EntityUtils.getContentCharSet(entity); 
       } catch (ClientProtocolException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       return null; 
      } 
     } 

     private class phpDown extends AsyncTask<String, Integer, String> { 
      @Override 
      protected String doInBackground(String... urls) { 
       StringBuilder jsonHtml = new StringBuilder(); //StringBuilder? 
       try { 
        URL url = new URL(urls[0]); 

        HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 

        if (conn != null) { 
         conn.setConnectTimeout(10000); 
         conn.setUseCaches(false); //setUseCaches? 

         if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { 
          BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); //InputStreamReader? 
          for (;;) { 
           String line = br.readLine(); 
           if (line == null) 
            break; 

           jsonHtml.append(line + "\n"); 
          } 
          br.close(); 
         } 
         conn.disconnect(); 
        } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
       return jsonHtml.toString(); 
      } 


      protected void onPostExecute(String str) { 
       String number; 
       String passwords; 

       try { 
        JSONObject root = new JSONObject(str); 
        JSONArray ja = root.getJSONArray("results"); 

        for (int i = 0; i < ja.length(); i++) { 
         JSONObject jo = ja.getJSONObject(i); 
         number = jo.getString("number"); 
         passwords = jo.getString("passwords"); 

         listItem.add(new ListItem(number, passwords));; 
        } 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 

       txtView.setText("number:" + listItem.get(0).getData(0) + "\npasswords:" 
         + listItem.get(0).getData(1)); 
      } 
     } 
    } 

任何评论感谢

+4

'listItem.get(0)'(in'onPostExecute')如果列表为空,该怎么办? –

+0

writeDB.php文件没有问题。我认为MainActivity.java无法连接到writeDB.php – whitehat

+0

您可能想让'readDB.php'返回一些有效的JSON .. –

回答

0

要知道phpDown是否可以连接到writeDB.php,打印出来jsonHtmldoInBackground()。如果它的内容来自您的writeDB.php,则表示它已成功连接。

但是从您的错误日志中,问题发生在onPostExecute()。请检查以下内容:

  1. 是字符串jsonHtml有效的json格式?
  2. 是否jsonHtml包含元素results数组?你应该在你的jsonHtml有这样的{results: [...]}
+0

谢谢。我解决了问题,程序正在工作。我不知道json的数组和名称,价值结构。之后我更改PHP代码妥善安卓工程。 – whitehat