2013-04-21 30 views
1

我一直在試圖創建一個應用程序來連接到運行在xampp服務器上的數據庫。過去我做了一個java應用程序來完成這項工作,我使用JDBC連接到數據庫。我檢查了這是否適用於android,我發現一個教程,其中的JDBC在Android上使用,但它不適用於我。我連接數據庫的另外兩個嘗試是HttpURLConnection和HttpClient方法。我從瀏覽中找到的解決方案尚未解決我的問題。我嘗試的兩種解決方案是,編輯xampp httpd-xampp.conf以允許任何連接。第二個是在PhpMyAdmin privilages部分爲手機添加一個用戶。我不知道我還可以嘗試其他選擇。任何人都可以給我任何意見這個問題。一個普通的java應用程序可以連接到服務器,沒有問題,我也可以訪問我的電話網頁瀏覽器上的服務器。這只是不能建立連接的應用程序。我無法讓我的android應用程序連接到我的xampp服務器上的外部數據庫

編輯接下來的問題我發現here。我試着用JDBC連接到我的數據庫,使用AsyncTask發佈該問題的用戶沒有麻煩進行連接。所以,我不認爲我在哪裏我的代碼去錯在這裏,如果滿級

應用程序代碼

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.Statement; 

import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 
import android.widget.TextView; 

public class ViewCarsEntered extends Activity implements OnTouchListener 
{ 

private TextView displayCars; 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_view_cars_entered); 
    displayCars = (TextView)findViewById(R.id.carSpaceDisplay); 
    displayCars.setOnTouchListener(this); 
} 

/** 
* Connect to the database 
* @return String 
*/ 
private class ConnectToDatabase extends AsyncTask<String,Void,String> 
{ 
    @Override 
    protected String doInBackground(String... arg0) 
    { 
     String response = " "; 
     String total = ""; 
     int rowCounter = 0; 

     try 
     { 
      Class.forName("com.mysql.jdbc.Driver"); 
      Connection connection = DriverManager.getConnection("jdbc:mysql://server_ip:3306/dbname", "username", "password"); 
      Statement statement = connection.createStatement(); 
      ResultSet resultSet = statement.executeQuery("SELECT VehicleDetected FROM entry"); 

      while(resultSet.next()) 
      { 
       rowCounter++; 
      } 

      total = Integer.toString(rowCounter); 

      response = " I am connected to the database";  
      Log.d("DebugTag", response); 

     }catch(Exception e){ 
      response = "Couldn't get a connection"; 
      Log.e("Error_Tag", response); 
     } 
     return response; 
    } 

    @Override 
    protected void onPostExecute(String result) 
    { 
     displayCars.setText(result); 
    } 
} 

/** 
* Constructor for the AsynchronousTask inner Class 
*/ 
public void ConnectToDatabase() 
{ 
    ConnectToDatabase connect = new ConnectToDatabase(); 
    connect.execute(); 
} 


@Override 
public boolean onTouch(View v, MotionEvent event) 
{ 
    ConnectToDatabase(); 
    return false; 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) 
{ 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.view_cars_entered, menu); 
    return true; 
} 
} 
+0

請問您的應用程序已經在清單中聲明Internet權限?當你運行你的代碼時會發生什麼?你是否從你的數據庫得到迴應,或者你有異常? – caiocpricci2 2013-04-21 00:33:47

+0

定義「不適合我」。也就是說,如果您使用的是Android 4.x,則任何嘗試從主UI線程上的設備訪問網絡都將導致「NetworkOnMainThreadException」。可能想檢查你的logcat。 – 323go 2013-04-21 00:43:16

+0

沒有工作,當我在我的設備上運行應用程序時,我的錯誤日誌消息總是顯示出來。「Log.e(」error_tag「,」無法建立與數據庫的連接「);」。我已經在清單中添加了Internet權限 – PyGuy91 2013-04-21 13:42:32

回答

1

我得到了應用程序的工作。我使用了HttpClient方法。我將該代碼添加到AsyncTask內部類中。在PHP方面,而不是給運行服務器的電腦的ip,我只是使用本地主機。這裏是下面的代碼,希望這將有助於未來的人。

connect_to_database.php

<?php 

//Parameters for connecting to the database 
$hostname = "localhost"; 
$database_name = "dbname"; 
$username = "user"; 
$password = "pass"; 

//Connection String. If it fails causes error message 
$connection = mysql_connect($hostname,$username,$password) or trigger_error(mysql_error(),E_USER_ERROR); 

//Access the database 
mysql_select_db($database_name, $connection); 

/*Query to get number of cars and execute the query 
*If there is a problem with the query an error is returned */ 
$get_number_of_cars = "SELECT VehicleDetected FROM entry "; 
$query_runner = mysql_query($get_number_of_cars) or die(mysql_error()); 
$counter = 0; 

while($row = mysql_fetch_array($query_runner)) 
{ 
    $counter++; 
} 

echo $counter; 
?> 

ViewCarsEntered.java

import org.apache.http.HttpResponse; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.ResponseHandler; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.BasicResponseHandler; 
import org.apache.http.impl.client.DefaultHttpClient; 

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.graphics.Color; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 
import android.widget.TextView; 

public class ViewCarsEntered extends Activity implements OnTouchListener 
{ 

private TextView displayCars; 
private TextView displaySuggestionMessage; 
private HttpPost post; 
private HttpResponse httpResponse; 
private HttpClient client; 
private ProgressDialog dialog = null; 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_view_cars_entered); 
    displayCars = (TextView)findViewById(R.id.carSpaceDisplay); 
    displaySuggestionMessage = (TextView)findViewById(R.id.carSpaceSuggestionsBox); 
    displayCars.setOnTouchListener(this); 
} 

/** 
* Connect to the database 
* @return String 
*/ 
private class ConnectToDatabase extends AsyncTask<String,Void,String> 
{ 
    @Override 
    protected String doInBackground(String... arg0) 
    { 
     String serverResponse = " "; 

     try 
     { 
      client = new DefaultHttpClient(); 
      post = new HttpPost("http://server_ip/folder_for_php_script/connect_to_database.php"); 
      httpResponse = client.execute(post); 

      ResponseHandler<String> responseHandler = new BasicResponseHandler(); 
      serverResponse = client.execute(post, responseHandler); 

     }catch(Exception e){ 
      serverResponse = "Could not connect to Database"; 
      Log.e("Error_Tag", e.toString()); 
     } 
     return serverResponse; 
    } 

    @Override 
    protected void onPostExecute(String result) 
    { 
     displayCars.setText(result); 

     int responseCheck = Integer.parseInt(result); 

     if(responseCheck <= 7) 
     { 
      displayCars.setTextColor(Color.BLACK); 
      displaySuggestionMessage.setText("It is ok to park in the main car park"); 
     } 

     else if(responseCheck <= 11) 
     { 
      displayCars.setTextColor(Color.YELLOW); 
      displaySuggestionMessage.setText("You may want to try the B block"); 
     } 

     else if(responseCheck >= 12) 
     { 
      displayCars.setTextColor(Color.RED); 
      displaySuggestionMessage.setText("Consider Alternate Parking"); 
     } 
    } 
} 

/** 
* Constructor for the AsynchronousTask inner Class 
*/ 
public void ConnectToDatabase() 
{ 
    ConnectToDatabase connect = new ConnectToDatabase(); 
    connect.execute(); 
} 

@Override 
public boolean onTouch(View v, MotionEvent event) 
{ 
    ConnectToDatabase(); 
    return true; 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) 
{ 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.view_cars_entered, menu); 
    return true; 
} 
} 
相關問題