Проблема с подключением MYSQL в приложении JAVA для Android

#java #android #mysql #kotlin

#java #Android #mysql #kotlin

Вопрос:

Я перепробовал все методы и способы из стека и видео, и ни один из них на самом деле не работал до сих пор.

ОСНОВНОЙ КЛАСС АКТИВНОСТИ

 package com.example.androidmysql;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.StrictMode;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

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

public class MainActivity extends AppCompatActivity {
    TextView text;
    Button show;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text = (TextView) findViewById(R.id.textView);
        show = (Button) findViewById(R.id.button);
        show.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                try {
                    Class.forName("com.mysql.cj.jdbc.Driver").newInstance();
                    Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/example","root","test");
                    Statement statement = connection.createStatement();
                    ResultSet resultSet = statement.executeQuery("SELECT * FROM user");
                    String records ="";
                    while (resultSet.next()) {
                        records  = resultSet.getString(1)   " "   resultSet.getString(2)   "n";
                    }
                    text.setText(records);
                }
                catch (Exception e) {
                    e.printStackTrace();
                    text.setText(e.toString());
                }
            }
        });
    }
}
 

Основная проблема заключается в том, что JDBC не может подключиться к базе данных

ВЫВОД

 W/System.err: java.sql.SQLNonTransientConnectionException: Could not create connection to database server.
W/System.err:     at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:110)
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)
        at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:1009)
        at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:826)
        at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:456)
        at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246)
        at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198)
        at java.sql.DriverManager.getConnection(DriverManager.java:580)
        at java.sql.DriverManager.getConnection(DriverManager.java:218)
        at com.example.androidmysql.MainActivity$1.onClick(MainActivity.java:47)
        at android.view.View.performClick(View.java:7448)
W/System.err:     at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:992)
        at android.view.View.performClickInternal(View.java:7425)
        at android.view.View.access$3600(View.java:810)
        at android.view.View$PerformClick.run(View.java:28305)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
 
  • Я использую последнюю версию mysql-connector-8.0.22.
  • Добавлены разрешения на доступ к Интернету в манифесте
  • Установлен сервер mysql 8.0.22
  • Я также изменил конфигурацию C:ProgramDataMySQLMySQL Сервер 8.0my.ini => bind-address=0.0.0.0
  • Проверено на разных JDK: 15, 1.8

Вот код, который я загрузил на github. Может ли кто-нибудь протестировать его на своем ПК с помощью своей базы данных example? https://github.com/simplybychris/DatabaseClientApp/tree/master

Пользователь базы данных и пароль хороши, потому что я протестировал его в отдельном классе без основного действия и вне Java project, и он работает… Похоже, это не будет работать в мобильных классах

Спасибо за любые советы

Комментарии:

1. Не подключайте приложение напрямую к базе данных mysql. Вам нужно серверное приложение для абстракции

2. Причина, по которой вы не подключаетесь напрямую, заключается в том, что вам нужно ввести пароль к своей базе данных в своем приложении, что является действительно плохой идеей — его затем тривиально взломали. Используйте веб-сервис между ними.

3. Кстати, вы пытаетесь подключить базу данных на вашем смартфоне (localhost), где не установлена база данных mysql

4. Но я хотел бы создать клиентское приложение для базы данных, в котором я мог бы указать URL, пользователя и пароль для входа в базу данных, поэтому нет смысла создавать для него API веб-службы. Или это?

5. @Jens Я хочу создать приложение, в которое вы можете поместить свои данные для входа в базу данных и просмотреть свою базу данных. Что-то вроде клиента базы данных

Ответ №1:

Я не знаю, почему люди игнорируют вопрос, если нет правильного ответа. В любом случае, после 2 дней поиска я, наконец, нашел решение. Проблема возникает при подключении к mysql с последней версией драйвера 8.0. Я предлагаю изменить его на mysql 5.7.