【问题标题】:Problem connect Android Studio-MySQL using JDBC (Error : java.sql.SQLNonTransientConnectionException: Could not create connection to database server.)使用 JDBC 连接 Android Studio-MySQL 时出现问题(错误:java.sql.SQLNonTransientConnectionException:无法创建与数据库服务器的连接。)
【发布时间】:2021-06-05 03:44:03
【问题描述】:

我想在 android studio 和 MySql 之间建立一个连接。

MySQL 版本 = MySQL Workbench 8.0 CE

MySQL 连接器版本 = mysql-connector-java-8.0.23.jar

我的数据库名称 = testandroid

我已经将连接器添加到我的项目中

我收到错误:java.sql.SQLNonTransientConnectionException: 无法创建与数据库服务器的连接。

代码:

private Connection getConnection(){
        Connection con;
        try{
            Class.forName("com.mysql.cj.jdbc.Driver").newInstance();
            con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/testandroid?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=GMT","root","");
            return con;
        }catch (Exception e){
            System.out.println("Error ************************"+e);
            return null;
        }
    }


    private ArrayList<User> getUserList()
    {
        ArrayList<User> userList = new ArrayList<>();
        Connection connection = getConnection();


        String query = "Select pseudo FROM `users` where userID="+1;
        Statement st;
        ResultSet rs;

        try{
            st =  connection.createStatement();
            rs = st.executeQuery(query);
            User user ;
            while (rs.next())
            {
                user = new User(rs.getString("pseudo"));
                userList.add(user);
            }

        }catch (Exception e){
            e.printStackTrace();
        }

        return userList;
    }


    private void showData(){

        ArrayList<User> list = getUserList();

        for (int i=0; i<list.size(); i++){

            test.setText(list.get(i).getPseudo());
            test.setText("fnpvrpogn");

        }

    }

错误

I/System.out: Error ************************java.sql.SQLNonTransientConnectionException: Could not create connection to database server.
W/System.err: java.lang.NullPointerException: Attempt to invoke interface method 'java.sql.Statement java.sql.Connection.createStatement()' on a null object reference
        at com.example.testjdbc.MainActivity.getUserList(MainActivity.java:54)
W/System.err:     at com.example.testjdbc.MainActivity.showData(MainActivity.java:73)
W/System.err:     at com.example.testjdbc.MainActivity.onCreate(MainActivity.java:24)
        at android.app.Activity.performCreate(Activity.java:7136)
W/System.err:     at android.app.Activity.performCreate(Activity.java:7127)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

【问题讨论】:

  • MySQL 连接器/J 8.0.x 驱动程序不适用于 Android。此外,您确实应该在移动设备上使用 JDBC,而不是构建一个 ReST 服务来在您的应用程序和数据库之间进行调解。
  • @MarkRotteveel 感谢您的回答,但是做 JDBC 和 ReST 服务还是使用 PHP 更安全?
  • 我不确定你想问什么。用您熟悉的语言编写您的 ReST 服务,无论是 Java、PHP、Node.js、C# 等等。关键是 1) 最近的 JDBC 驱动程序在 Android 下根本不起作用,因为它们可能使用 Android 上不存在的 Java 功能或类,2) 来自移动设备的直接数据库连接可能很慢,以及 3)来自移动设备的直接数据库连接不是很安全。
  • 哦,好的,非常感谢,对我来说是 PHP。但我在 android studio 中使用“Volley”。

标签: java android mysql jdbc


【解决方案1】:

对于在 Android 设备或模拟器上运行的软件,localhost Android 设备或模拟器。很可能,您的 MySQL 实例没有在您的 Android 设备或模拟器上运行。

如果您在 Android 设备上运行应用,则需要使用运行 MySQL 的机器的 IP 地址或主机名。

如果您在模拟器上运行应用,并且 MySQL 与模拟器在同一台计算机上运行,​​请使用 10.0.2.2 作为地址而不是 localhost


另外,请注意,从可靠性和安全性的角度来看,JDBC 并不是为在移动设备上使用而设计的。请考虑做一些其他事情,例如让您的应用与 Web 服务对话,而后者又与数据库对话。

【讨论】:

  • 好的,非常感谢。但“网络服务”是什么意思?
  • 它不工作,但我会继续搜索
猜你喜欢
  • 2021-07-21
  • 2019-06-10
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
  • 2014-08-06
  • 2014-03-06
  • 2021-06-30
  • 2017-05-29
相关资源
最近更新 更多