如何让MySQL Connector / J在android上运行?

我有一台在本地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),请通过LTE互联网连接使用我的Android手机,我得到一个不同的错误:

“无法创建与数据库服务器的连接”

到目前为止,我的研究都没有帮助过我。 有谁知道我的问题可能来自哪里? 提前致谢 :)

移植到Android世界的Java开发人员之间的一般误解是,为旧的优秀Java创建的所有内容也可以在Android上使用。 由于Android的Java使用违反了主要的Java原则,“一次编写,到处运行”,这根本不是真的。 我见过人们试图在Android上使用常见的Apache jar,这导致了奇怪的错误(请参阅无法在Eclipse中导入Apache HTTP )。

Java JDBC驱动程序和API似乎也存在同样的问题,例如,请参阅此处的答案: 使用JDBC从Android连接到MySQL

常见建议 – 每次尝试使用Android的第三方JAR时,请检查它是否与后者兼容,或者是否有特定于Android的端口。

如果使用正确的连接器,则可能。 我使用连接器3.0.17,在其他一些示例中,连接器是mysql-connector-java-5.1.24-bin.jar

  1. 只需下载正确的连接器。
  2. 通过libs上的connector-java.xxx-bin.jar
  3. 导入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(); } } } } 

它对我来说很完美,我没有遇到任何问题!

通常,建议的方法是发布到Web服务,并允许Web服务在数据库上执行所需的操作。 但是, GitHub上有一个开源库,它允许您直接连接到数据库服务器而无需Web服务。

该库是相当新的,已经针对MySQL 5.1 – > 5.7进行了测试,它也应该与MariaDB的等效MySQL版本兼容。

免责声明:我写了。