Доступ к базе данных mysql с помощью драйвера jdbc из приложения для Android

#android #mysql #jdbc

Вопрос:

Я получаю эту ошибку всякий раз, когда запрашиваю таблицу:

 2021-06-15 11:13:30.550 18277-18343/com.example.myapplication E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
    Process: com.example.myapplication, PID: 18277
    java.lang.RuntimeException: An error occurred while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:365)
        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:257)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
        at java.lang.Thread.run(Thread.java:784)
     Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/mysql/cj/MysqlType;
        at com.mysql.cj.protocol.a.NativeProtocol.findMysqlType(NativeProtocol.java:1466)
        at com.mysql.cj.protocol.a.ColumnDefinitionReader.unpackField(ColumnDefinitionReader.java:134)
        at com.mysql.cj.protocol.a.ColumnDefinitionReader.read(ColumnDefinitionReader.java:77)
        at com.mysql.cj.protocol.a.ColumnDefinitionReader.read(ColumnDefinitionReader.java:40)
        at com.mysql.cj.protocol.a.NativeProtocol.read(NativeProtocol.java:1588)
        at com.mysql.cj.protocol.a.TextResultsetReader.read(TextResultsetReader.java:68)
        at com.mysql.cj.protocol.a.TextResultsetReader.read(TextResultsetReader.java:48)
        at com.mysql.cj.protocol.a.NativeProtocol.read(NativeProtocol.java:1601)
        at com.mysql.cj.protocol.a.NativeProtocol.readAllResults(NativeProtocol.java:1655)
        at com.mysql.cj.NativeSession.loadServerVariables(NativeSession.java:765)
        at com.mysql.cj.jdbc.ConnectionImpl.initializePropsFromServer(ConnectionImpl.java:1303)
        at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:964)
        at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:823)
        at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:453)
        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:569)
        at java.sql.DriverManager.getConnection(DriverManager.java:219)
        at com.example.myapplication.MainActivity$Task.doInBackground(MainActivity.java:177)
        at com.example.myapplication.MainActivity$Task.doInBackground(MainActivity.java:170)
        at android.os.AsyncTask$2.call(AsyncTask.java:345)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:257) 
 

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

 class Task extends AsyncTask<Void,Void,Void> {
    String records = "", errors = "";
    @Override
    protected Void doInBackground(Void... voids) {
        try{
            Class.forName("com.mysql.cj.jdbc.Driver");
            Connection connection = DriverManager.getConnection("jdbc:mysql://IP/DB","user","pass");
            Statement statement = connection.createStatement();
            ResultSet resultSet = statement.executeQuery("select * from android_test");
            while(resultSet.next()){
                records  = resultSet.getString(1)   " "   resultSet.getString(2)   "n";
            }
        }catch (Exception e){
            errors = e.toString();
        }
        return null;
    }
    public void onPostExecute(Void aVoid){
        message.setText(records);
        if (errors != "") {
            message.setText(errors);
            Toast.makeText(MainActivity.this,errors.toString(),Toast.LENGTH_LONG).show();
        }
    }
}
 

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

1. Я смог избавиться от ошибки, понизив драйвер jdbc до 5.1.4.