簡體   English   中英

將 Android Studio 應用程序連接到遠程 MySQL 時出錯:java.ZAC5C74B64B4B8352EF2F181AFFB5AC2 無法創建與數據庫的連接

[英]Error connecting Android Studio app to remote MySQL: java.sql.SQLNonTransientConnectionException: Could not create connection to database server

我正在嘗試將 Android Studio 應用程序連接到遠程 MYSQL 數據庫,但顯示無法創建與數據庫的連接的錯誤。

我做了一些故障排除:

  1. 檢查數據庫是否正在運行(它是)
  2. 從我計算機中的 MySQL 工作台連接到遠程數據庫(我能夠連接和檢索數據)
  3. 我還在開發另一個應用程序(沒有 Android Studio)。 我使用了相同的連接類,並且能夠訪問數據。

--- 有了這個,我認為這不是服務器問題。 ---

  1. 使用了不同的 JDBC 驅動程序(下面我使用的版本的 Gradle 實現)
implementation group: 'mysql', name: 'mysql-connector-java', version: '8.0.22'
implementation group: 'mysql', name: 'mysql-connector-java', version: '8.0.23'
implementation group: 'mysql', name: 'mysql-connector-java', version: '8.0.13'
  1. 我還嘗試在項目文件中添加 .jar 文件,但出現其他無法識別驅動程序的錯誤。

--- 有了這個,我注意到在 Gradle 中實現驅動程序不是錯誤,因為它顯然正在識別驅動程序 ---注意:我目前正在使用 gradle 實現。

  1. 我將互聯網權限添加到 AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
  1. 我嘗試使用ASYNCTASK實現從數據庫中檢索數據的代碼,但收到以下錯誤

Main class WITH ASYNCTASK (MainActivity.java) * 注意:這個 class 中的代碼只是為了測試我是否能夠從數據庫中獲取數據。 與我試圖在應用程序本身中實現的任何功能無關。

public class MainActivity extends AppCompatActivity {

    AlertDialog.Builder builder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {

                
                builder = new AlertDialog.Builder(MainActivity.this);

                builder.setTitle("Data");
                new GetCultivos().execute();
                builder.setPositiveButton("Accept", null);

                AlertDialog dialog = builder.create();
                dialog.show();
            }
        });

    class GetCultivos extends AsyncTask<Void, Void, Void>{

        String list = "Data = ";

        @Override
        protected Void doInBackground(Void... voids) {

            CultivoDao cultivoDao = new CultivoDao();
            List<Cultivo> listaCultivos = cultivoDao.obtenerCultivos();
            for (Cultivo i : listaCultivos){
                list = i.getIdCultivo() + " " + i.getNombre() + ", ";
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void eVoid){
            builder.setMessage(list);
        }
    }
}
E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
    Process: com.example.appmov, PID: 5699
    java.lang.RuntimeException: An error occurred while executing doInBackground()
        at android.os.AsyncTask$4.done(AsyncTask.java:399)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
        at java.util.concurrent.FutureTask.run(FutureTask.java:271)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:289)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:919)
     Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Ljava/sql/SQLType;
        at com.mysql.cj.jdbc.DatabaseMetaData.getInstance(DatabaseMetaData.java:729)
        at com.mysql.cj.jdbc.ConnectionImpl.getMetaData(ConnectionImpl.java:1180)
        at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:446)
        at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:240)
        at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:207)
        at java.sql.DriverManager.getConnection(DriverManager.java:580)
        at java.sql.DriverManager.getConnection(DriverManager.java:218)
        at com.DAO.appmov.CultivoDao.StartConnection(CultivoDao.java:30)
        at com.DAO.appmov.CultivoDao.obtenerCultivos(CultivoDao.java:49)
        at com.example.appmov.MainActivity$GetCultivos.doInBackground(MainActivity.java:228)
        at com.example.appmov.MainActivity$GetCultivos.doInBackground(MainActivity.java:220)
        at android.os.AsyncTask$3.call(AsyncTask.java:378)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:289) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
        at java.lang.Thread.run(Thread.java:919) 
     Caused by: java.lang.ClassNotFoundException: Didn't find class "java.sql.SQLType" on path: DexPathList[[zip file "/data/app/com.example.appmov-U33MrmDYU8kMl3MFpFCdcA==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.appmov-U33MrmDYU8kMl3MFpFCdcA==/lib/arm64, /system/lib64]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:196)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        at com.mysql.cj.jdbc.DatabaseMetaData.getInstance(DatabaseMetaData.java:729) 
        at com.mysql.cj.jdbc.ConnectionImpl.getMetaData(ConnectionImpl.java:1180) 
        at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:446) 
        at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:240) 
        at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:207) 
        at java.sql.DriverManager.getConnection(DriverManager.java:580) 
        at java.sql.DriverManager.getConnection(DriverManager.java:218) 
        at com.DAO.appmov.CultivoDao.StartConnection(CultivoDao.java:30) 
        at com.DAO.appmov.CultivoDao.obtenerCultivos(CultivoDao.java:49) 
        at com.example.appmov.MainActivity$GetCultivos.doInBackground(MainActivity.java:228) 
        at com.example.appmov.MainActivity$GetCultivos.doInBackground(MainActivity.java:220) 
        at android.os.AsyncTask$3.call(AsyncTask.java:378) 
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:289) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
        at java.lang.Thread.run(Thread.java:919) 
I/Process: Sending signal. PID: 5699 SIG: 9
  1. 所以我嘗試在沒有 ASYNCTASK 的情況下實現代碼,但我收到了您可以在錯誤日志中看到的錯誤。

Class 我用來連接數據庫(CultivoDao.java)

public class CultivoDao {

    private Connection connection;
    private Statement statement;

    //Method to start the connection
    private void StartConnection() {

        String url = "jdbc:mysql://remotemysql.com:3306/hUfMa4wLpe";
        String usuario = ***HERE IS THE USERNAME***;
        String password = ***HERE IS THE PASSWORD***;


        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            connection = DriverManager.getConnection(url, usuario, password);
            statement = connection.createStatement();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //Method to close the connection
    private void CloseConnection(){
        try {
            connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //Methog to get the data
    public List<Cultivo> obtenerCultivos(){
        List<Cultivo> listaCultivos = new ArrayList<>();
        try {
            StartConnection();
            ResultSet rs = statement.executeQuery("Select * from cultivo");
            while(rs.next()){
                Cultivo cultivo = new Cultivo(rs.getInt("idCultivo"), rs.getString("nombre"));
                listaCultivos.add(cultivo);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        CloseConnection();
        return listaCultivos;
    }
}

Main class WITHOUT ASYNCTASK (MainActivity.java) * 注意:此 class 中的代碼只是為了測試我是否能夠從數據庫中獲取數據。 與我試圖在應用程序本身中實現的任何功能無關。

public class MainActivity extends AppCompatActivity {

    AlertDialog.Builder builder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {

                
                builder = new AlertDialog.Builder(MainActivity.this);
                
                String list = "Database list = ";

                CultivoDao cultivoDao = new CultivoDao();
                List<Cultivo> listaCultivos = cultivoDao.obtenerCultivos();
                for (Cultivo i : listaCultivos){
                    list = i.getIdCultivo() + " " + i.getNombre() + ", ";
                }

                builder.setTitle("Data");
                builder.setMessage(list);
                builder.setPositiveButton("Accept", null);

                AlertDialog dialog = builder.create();
                dialog.show();
            }
        });
    }
}

我使用的實際版本是沒有 ASYNCTASK 的版本

我正在物理設備上測試這個應用程序。 我不知道這會以某種方式影響。

錯誤日志:

W/System.err: java.sql.SQLNonTransientConnectionException: Could not create connection to database server.
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:110)
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
W/System.err:     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:1008)
        at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:825)
        at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:455)
        at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:240)
        at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:207)
        at java.sql.DriverManager.getConnection(DriverManager.java:580)
        at java.sql.DriverManager.getConnection(DriverManager.java:218)
        at com.DAO.appmov.CultivoDao.StartConnection(CultivoDao.java:30)
        at com.DAO.appmov.CultivoDao.obtenerCultivos(CultivoDao.java:49)
        at com.example.appmov.MainActivity$1.onClick(MainActivity.java:88)
        at android.view.View.performClick(View.java:7870)
        at android.widget.TextView.performClick(TextView.java:14970)
        at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:967)
        at android.view.View.performClickInternal(View.java:7839)
        at android.view.View.access$3600(View.java:886)
        at android.view.View$PerformClick.run(View.java:29363)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:237)
        at android.app.ActivityThread.main(ActivityThread.java:7814)
        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:1068)
W/System.err: Caused by: android.os.NetworkOnMainThreadException
        at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1565)
        at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:115)
        at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:103)
        at java.net.InetAddress.getAllByName(InetAddress.java:1152)
        at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:132)
        at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:65)
        at com.mysql.cj.NativeSession.connect(NativeSession.java:152)
        at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:955)
        ... 22 more
    java.lang.NullPointerException: Attempt to invoke interface method 'java.sql.ResultSet java.sql.Statement.executeQuery(java.lang.String)' on a null object reference
        at com.DAO.appmov.CultivoDao.obtenerCultivos(CultivoDao.java:50)
        at com.example.appmov.MainActivity$1.onClick(MainActivity.java:88)
        at android.view.View.performClick(View.java:7870)
        at android.widget.TextView.performClick(TextView.java:14970)
W/System.err:     at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:967)
        at android.view.View.performClickInternal(View.java:7839)
        at android.view.View.access$3600(View.java:886)
        at android.view.View$PerformClick.run(View.java:29363)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:237)
        at android.app.ActivityThread.main(ActivityThread.java:7814)
        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:1068)
    java.lang.NullPointerException: Attempt to invoke interface method 'void java.sql.Connection.close()' on a null object reference
        at com.DAO.appmov.CultivoDao.CloseConnection(CultivoDao.java:40)
        at com.DAO.appmov.CultivoDao.obtenerCultivos(CultivoDao.java:58)
        at com.example.appmov.MainActivity$1.onClick(MainActivity.java:88)
        at android.view.View.performClick(View.java:7870)
        at android.widget.TextView.performClick(TextView.java:14970)
        at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:967)
        at android.view.View.performClickInternal(View.java:7839)
        at android.view.View.access$3600(View.java:886)
        at android.view.View$PerformClick.run(View.java:29363)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:237)
        at android.app.ActivityThread.main(ActivityThread.java:7814)
        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:1068) 

如何在不實施 PHP 的情況下解決此問題,這是我發現的另一種方式,因為我無法編輯托管數據庫的服務器的任何內容。

謝謝!

ClassNotFoundException: Didn't find class "java.sql.SQLType"

Since java.sql.SQLType was added in Java 8, and doesn't exist at all on Android, you need to use a JDBC driver that is Java 7 compatible, which means you cannot use Connector/J 8.0, but must use version 5.1 .

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM