将android应用程序连接到sql数据库?

问题描述:

我试过了这个例子来与数据库连接,我有简单的数据库,这就是Java类:将android应用程序连接到sql数据库?

package com.cvele.android.sqlconn; 
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.LinearLayout; 
import android.widget.TextView; 


public class SqlconnActivity extends Activity { 
    /** Called when the activity is first created. */ 

    TextView txt; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     LinearLayout rootLayout = new LinearLayout(getApplicationContext()); 
     txt = new TextView(getApplicationContext()); 
     rootLayout.addView(txt); 
     setContentView(rootLayout); 
     txt.setText("Connecting..."); 
     txt.setText(getServerData(LINK_PHP)); 
    } 
    public static final String LINK_PHP = "http://10.0.2.2/sajt.php"; 

    private String getServerData(String returnString) { 

     InputStream is = null; 
     String result = ""; 
     ArrayList<NameValuePair>nameValuePairs = new ArrayList<NameValuePair>(); 
     nameValuePairs.add(new BasicNameValuePair("year","1970")); 

     try{ 
      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost(LINK_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()); 
     } 

     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()); 
     } 

     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.getString("sex")+ 
        ", birthyear: "+json_data.getInt("birthyear") 
        ); 

       returnString += "\n\t" + jArray.getJSONObject(i); 
      } 
     }catch(JSONException e){ 
      Log.e("log_tag", "Error parsing data "+e.toString()); 
     } 
     return returnString; 
    } 
} 

,这是PHP:

<? 

$databasehost = "127.0.0.1"; 
$databasename = "peopledata"; 
$databaseusername ="nikola"; 
$databasepassword = "nikola"; 

$con = mysql_connect($databasehost,$databaseusername,$databasepassword) or die(mysql_error()); 
mysql_select_db($databasename) or die(mysql_error()); 
$query = mysql_query("SELECT * FROM people WHERE birthyear >'".$_REQUEST['year']."'"); 


if (mysql_errno()) { 
    header("HTTP/1.1 500 Internal Server Error"); 
    echo $query.'\n'; 
    echo mysql_error(); 
} 
else 
{ 
    $rows = array(); 
    while($r = mysql_fetch_assoc($query)) { 
     $rows[] = $r; 
    } 
    print json_encode($rows); 
} 
?> 

所以,当我建立这一点,总是在字符串LINK_PHP =“http://10.0.2.2/sajt.php”中写下“”之间的内容。我无法从我的数据库中获取任何数据。我的问题是,为什么它总是写在我的应用程序..?提前致谢。 这就是我得到: enter image description here

好吧,这是我得到的logcat:

04-11 16:02:33.064: I/dalvikvm(811): threadid=3: reacting to signal 3 
04-11 16:02:33.256: I/dalvikvm(811): Wrote stack traces to '/data/anr/traces.txt' 
04-11 16:02:33.544: I/dalvikvm(811): threadid=3: reacting to signal 3 
04-11 16:02:33.604: I/dalvikvm(811): Wrote stack traces to '/data/anr/traces.txt' 
04-11 16:02:33.724: E/log_tag(811): Error in http connection android.os.NetworkOnMainThreadException 
04-11 16:02:33.724: E/log_tag(811): Error converting result java.lang.NullPointerException 
04-11 16:02:33.744: E/log_tag(811): Error parsing data org.json.JSONException: End of input at character 0 of 
04-11 16:02:33.944: D/gralloc_goldfish(811): Emulator without GPU emulation detected. 
04-11 16:02:34.044: I/dalvikvm(811): threadid=3: reacting to signal 3 
04-11 16:02:34.104: I/dalvikvm(811): Wrote stack traces to '/data/anr/traces.txt' 
+0

如果你在使用WireShark进行模拟器检查工作,如果你真的从服务器接收它们。 – 2012-04-11 16:15:09

咨询logcat的输出。想一想,你会在那里看到关于例外的消息。

使用Eclipse,您可以使用Window> Show View> LogCat打开LogCat输出。

根据这个

Error in http connection android.os.NetworkOnMainThreadException 

您将自己的应用蜂窝或更高版本。 exception是因为您正在执行来自主(GUI)线程的网络操作而强烈禁止:) 尝试将您的应用程序定位到API级别10(姜饼)以尝试您的代码。但进一步将您的网络操作移至AsyncTask

+0

我看到了,我添加了LogCat ...你能稍微解释一下吗?谢谢。 – cvele 2012-04-11 16:18:23

+0

如果他将某些东西放入日志中,不仅会出错,还会有一定的意义。 – 2012-04-11 16:19:07

+0

[http://stackoverflow.com/questions/2206822/no-internet-on-android-emulator-why-and-how-to-fix](http://stackoverflow.com/questions/2206822/no-internet -on-android-emulator-why-and-how-to-fix) – 2012-04-11 16:22:50

再一次,检查实际收到的HTTP消息:好像你得到XML而不是JSON。

+0

或者您可以发布您从服务器连接获得的响应内容。将“is”内容添加到您的问题中。 – 2012-04-11 17:44:47

  1. 您不能在同一个线程(来自较新版本的Android SDK)上运行您的NETWORK活动。
  2. 为此,请执行Asynctask。即使考虑到记忆,它也能处理你的所有任务。
  3. 还有Runnable线程,但请通过AsyncTask
  4. 获取输入流。使while loop读取流和append它与String
  5. 现在,如果你有XML,那么通过Document对象解析XML。为此,请通过DocumentBuilderFactory。 (例如xml)。
  6. 现在,从Document(对象doc中的实例)获取您的数据,如doc.getElementByTagName("yourxmltaghere");
  7. 但是,如果您使用JSON,那么请持有您的JSON。如果它包含子对象,则使for循环直到mArray.length,然后逐个获取您的数据。

上面,你说的Value <?xml of type java.lang.String cannot be converted to JSONArray,这意味着你想要将你的XML转换为JSON。所以,我没有你的代码CASTING。但是,我通过以下方式做到了这一点。

InputStream is = response.getEntity().getContent(); 
BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
StringBuilder sb = new StringBuilder(); 
String line = 
while ((line = reader.readLine()) != null) { 
     sb.append(line + "\n"); 
} 



String xml = sb.toString();       
JSONObject baseObject = XML.toJSONObject(xml); 

JSONObject todo_items = baseObject.getJSONObject("todo-items"); 
JSONArray todo_item = todo_items.getJSONArray("todo-item"); 
tempItems = GenerateVO(todo_item); 

这里,XML是我加载的类。我没有发现任何其他如此使用这个。我从JSON提供的org.json包中获得了此课程。通过谷歌来获得或从这里获得。 XML LINK