2012-04-11 13 views
1

私は、データベースに接続するため、この例を試してみましたが、私は単純なデータベースを持っている、これはJavaクラスです:SQLデータベースを使用してAndroidアプリを接続していますか?

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

[OK]を、これは私が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で確認してください。 –

答えて

1

はLogCat出力を参照してください。例外についてのメッセージが表示されます。

Eclipseを使用すると、ウィンドウ>表示の表示> LogCatでLogCatの出力を開くことができます。

このライン

Error in http connection android.os.NetworkOnMainThreadException 

によると、あなたは、ハニカム以降にアプリをターゲットにしました。 あなたのアプリケーションをAPIレベル10(ジンジャーブレッド)にターゲット設定して、コードを試してみてください。しかし、さらにネットワーク操作をAsyncTaskに移動してください。

+0

私はLogCatを追加しました...少し説明できますか?ありがとう。 – cvele

+0

エラーだけでなく、何かをログに記録しておくと意味があります。 –

+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-to-fix) –

1

また、実際に受信したHTTPメッセージを確認してください:JSONではなくXMLを取得したようです。

+0

、またはサーバー接続から取得した応答内容を投稿することができます。あなたの質問に「is」コンテンツを追加してください。 –

2
  1. あなたのNETWORKアクティビティを同じスレッド(Android SDKの新しいバージョンから)で実行することはできません。
  2. これを行うには、Asynctaskを実装してください。メモリを考慮してもすべてのタスクを処理します。
  3. Runnableスレッドもありますが、AsyncTaskを通過します。
  4. 入力ストリームを取得します。ストリームを読み取るためにwhile loopを作成し、Stringappendとします。
  5. XMLを使用している場合は、DocumentオブジェクトでXMLを解析します。このためには、DocumentBuilderFactoryまで行ってください。 (xmlの例)。
  6. Document(オブジェクトのインスタンスのドキュメント)のデータをdoc.getElementByTagName("yourxmltaghere")のように取得してください。
  7. JSONを使用している場合は、JSONを保持してください。子オブジェクトがある場合は、forをループしてmArray.lengthまでループし、次にデータを1つずつ取得します。

上記では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パッケージからこのクラスを得ました。それを持っているか、ここから取得するにはgoogleを経由してください。 XML LINK

関連する問題