有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使MySQL Connector/J在安卓上工作?

我有一个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中工作得非常好,可以执行任意多个SELECT和UPDATE SQL请求,而不会出现任何问题。 当我试图使这个请求方法适应我的主要活动时。java类,我的安卓应用程序确实正确加载了驱动程序,但无法与MySQL服务器通信,并返回一个错误

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

"Communication link failure. The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server."

但是,如果我试图在前面的代码中输入服务器的外部IP地址(不要担心MySQL端口对互联网开放,我的服务器正在监听任何IP),通过LTE互联网连接使用我的安卓手机,我会遇到另一个错误:

"Could not create connection to database server"

到目前为止,我的研究都没有帮到我。有人知道我的问题来自哪里吗? 提前感谢:)


共 (3) 个答案

  1. # 1 楼答案

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

    该库相当新,已经针对MySQL 5.1进行了测试->;5.7还应与MariaDB的等效MySQL版本兼容

    免责声明:是我写的

  2. # 2 楼答案

    正在转向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的端口

  3. # 3 楼答案

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

    1. 只需下载正确的连接器
    2. 通过java连接器。x、 x.x-bin。自由现金罐
    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();
                      }
                  }
              }
          }
      

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