如何在安卓设备上使用MySQL Connector/J?

3

我在一台本地Linux机器上运行了一个MySQL服务器。我并没有遇到任何与它通信或通过简单的Java程序(在Eclipse中运行)使用MySQL Connector/J执行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中运行良好,可以执行任意数量的SELECT和UPDATE SQL请求,没有任何问题。 当我尝试将此请求方法适应于我的MainActivity.java类时,我的安卓应用程序能够正确加载驱动程序,但无法与我的MySQL服务器通信,并返回错误。
如果我在上一个代码中输入本地IP地址到我的服务器并将我的安卓手机连接到Wi-Fi上,那么我的应用程序会返回:
"通讯链路失败。最后一次成功向服务器发送数据包是0毫秒前。驱动程序没有收到来自服务器的任何数据包。"
但是,如果我尝试在同样的先前代码中输入外部IP地址到我的服务器(不要担心,MySQL端口对Internet是开放的,我的服务器正在监听任何IP),并使用LTE互联网连接我的安卓手机,我会得到一个不同的错误:
"无法创建到数据库服务器的连接"
截至目前为止,我的研究都没有帮助我解决问题。有人知道我的问题可能来自哪里吗? 提前感谢你们:)
3个回答

3
通常,建议的方法是发布到Web服务,并允许Web服务在数据库上执行所需操作。然而,在GitHub上有一个开源库,它允许您直接连接到数据库服务器,而无需Web服务。
该库相当新,并已针对MySQL 5.1-> 5.7进行了测试,这也应与MariaDB的等效MySQL版本兼容。
免责声明:我写了它。

3
Java开发者在转到Android领域时的普遍误解是,一切为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的移植版本。

感谢您抽出时间回答。看起来我需要使用一个 PHP 脚本作为接口。 - gotgot1995

2

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

  1. Just download the right connector.
  2. Past the connector-java.x.x.x-bin.jar on libs
  3. Import the java.sql

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

    Use the next method to connect

    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();
                    }
                }
            }
        }
    
它对我来说非常完美,我没有遇到任何问题!!!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接