我在本地Linux机器上运行了MySQL服务器。我没有遇到任何与它通信的问题,并且使用MySQL Connector / J通过一个简单的Java程序(在eclipse中运行)执行SQL语句。 这是我简单的Java程序:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.lang.*;
public class main{
private static void request(){
String url = "jdbc:mysql://myadress:3306/mydatabase";
String user = "user";
String passwd = "passwd";
Connection conn = null;
try{
/* Initializing the connection */
conn = DriverManager.getConnection(url, user, passwd);
Statement statement = conn.createStatement();
ResultSet resultset = statement.executeQuery(/* MY SQL reqquest */);
while(resultset.next()){
System.out.println(resultset.getString(/* THE COLUMN AND ROW I WANTED IN MY REQUEST */));
}
}catch(SQLException e){
System.out.println("SQL connection error: " + e.getMessage());
}finally {
if(conn != null){
try{
/* CLosing connection */
conn.close();
}catch (SQLException e){
System.out.println("Error while closing the connection: " + e.getMessage());
}
}
}
}
public static void main(String[] args) {
try{ // Loading the MySQL Connector/J driver
Class.forName("com.mysql.jdbc.Driver");
}catch(ClassNotFoundException e){
System.out.println("Error while loading the Driver: " + e.getMessage());
}
request();
}
}
这段代码在eclipse中完美运行,可以执行与UPDATE SQL请求一样多的SELECT而没有任何问题。 当我尝试将此请求方法调整到我的MainActivity.java类时,我的android应用程序确实正确加载了驱动程序,但无法与我的MySQL服务器通信并返回错误。
如果我在上一段代码中输入本地IP地址到我的服务器并将我的Android手机连接到Wi-Fi,那么我的应用程序会返回给我:
"通讯链接失败。最后一个数据包成功发送到 服务器是0毫秒前。驱动程序没有收到任何数据包 来自服务器。"
但是,如果我尝试使用相同的先前代码输入外部IP地址到我的服务器(不要担心MySQL端口是对互联网开放的,而我的服务器正在监听任何IP),请使用我的Android手机通过LTE互联网连接,我得到了一个不同的错误:
"无法创建与数据库服务器的连接"
到目前为止,我的研究都没有帮助过我。有谁知道我的问题可能来自哪里? 在此先感谢:)
答案 0 :(得分:3)
移植到Android世界的Java开发人员之间的一般误解是,为旧的优秀Java创建的所有内容也可以在Android上使用。由于Android的Java使用违反了主要的Java原则,因此只需编写一次,在任何地方运行即可,但事实并非如此。我发现有人试图在Android上使用常见的Apache jar,导致出现奇怪的错误(请参阅Can't import Apache HTTP in Eclipse)。
对于Java JDBC驱动程序和API,似乎也存在同样的问题,例如:在这里查看答案:Connecting to MySQL from Android with JDBC
常见建议 - 每次尝试在Android上使用第三方JAR时,请检查它是否与后者兼容,或者是否有特定于Android的端口。
答案 1 :(得分:2)
如果使用正确的连接器,则可以。 我使用连接器3.0.17,在其他一些例子中,连接器是mysql-connector-java-5.1.24-bin.jar
导入java.sql
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
使用下一个方法连接
public void conectarBDMySQL (String user, String password,
String ip, String port, String cat)
{
if (conexionMySQL == null)
{
String urlConexionMySQL = "";
if (cat!= "")
urlConexionMySQL = "jdbc:mysql://" + ip + ":" + port+ "/" + cat;
else
urlConexionMySQL = "jdbc:mysql://" + ip + ":" + port;
if (user!= "" & password!= "" & ip != "" & port!= "")
{
try
{
Class.forName("com.mysql.jdbc.Driver");
conexionMySQL = DriverManager.getConnection(urlConexionMySQL,
user, password);
}
catch (ClassNotFoundException e)
{
Toast.makeText(getApplicationContext(),
"Error: " + e.getMessage(),
Toast.LENGTH_SHORT).show();
}
catch (SQLException e)
{
Toast.makeText(getApplicationContext(),
"Error: " + e.getMessage(),
Toast.LENGTH_SHORT).show();
}
}
}
}
它对我来说很完美,我没有遇到任何问题!!!
答案 2 :(得分:2)
Generally, the recommended approach is to post to a web service, and allow the web service to perform the required actions on the database. However, there is an open source library on GitHub which allows you to connect directly to the database server without the need of a web service.
The library is fairly new and has been tested against MySQL 5.1 -> 5.7 which should also be compatible with the equivalent MySQL version to MariaDB.
Disclaimer: I wrote it.