2013-04-21 29 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; 
} 
} 
相关问题