【问题标题】:How to make MySQL Connector/J working on android?如何使 MySQL Connector/J 在 android 上工作?
【发布时间】:2014-09-22 13:44:09
【问题描述】:

我有一个 MySQL 服务器在本地 Linux 机器上运行。我没有遇到任何问题,通过一个简单的 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 中完美运行,并且可以毫无问题地执行与 UPDATE SQL 请求一样多的 SELECT。 当我尝试将此请求方法调整到我的 MainActivity.java 类时,我的 android 应用程序确实正确加载了驱动程序,但无法与我的 MySQL 服务器通信并返回错误。

如果我在前面的代码中输入本地 IP 地址到我的服务器并将我的 android 手机连接到 Wi-Fi,那么我的应用程序会返回我:

"通信链路故障。最后一个数据包成功发送到 服务器是 0 毫秒前。驱动程序没有收到任何数据包 来自服务器。”

但是,如果我尝试在之前的代码中向我的服务器输入一个外部 IP 地址(不要担心 MySQL 端口对互联网开放并且我的服务器正在侦听任何 IP),请使用我的 android 手机通过LTE 互联网连接,我收到另一个错误:

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

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

【问题讨论】:

    标签: java android mysql


    【解决方案1】:

    在转向 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 上使用 3rd 方 JAR 时,请检查它是否与后者兼容,或者是否有特定于 Android 的端口。

    【讨论】:

    • 感谢您花时间回答。看来我将不得不使用 PHP 脚本作为接口。
    【解决方案2】:

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

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

    免责声明:我写的。

    【讨论】:

      【解决方案3】:

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

      1. 只需下载正确的连接器。
      2. libs 上的 connector-java.x.x.x-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();
                        }
                    }
                }
            }
        

      它非常适合我,我没有遇到任何问题!!!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-28
        • 2016-09-20
        • 2020-05-08
        • 2019-12-01
        • 1970-01-01
        相关资源
        最近更新 更多