【问题标题】:Android studio connect to mysql keep crashingAndroid Studio 连接到 mysql 一直崩溃
【发布时间】:2021-07-21 11:45:18
【问题描述】:

这是我的 MainActivity.java

我是安卓工作室的新手。我尝试将 android studio 与 mysql 连接,但是当我运行模拟器时显示 androidapp 继续停止。我调试,它将停在 void doInBackground 上。我的代码有什么问题吗?

package de.vogella.mysql.androidmysql;

import androidx.appcompat.app.AppCompatActivity;

import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import org.w3c.dom.Text;

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

public class MainActivity extends AppCompatActivity {

    TextView text, errorText;
    Button show;

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

        text = (TextView) findViewById(R.id.textView);
        errorText = (TextView) findViewById(R.id.textView2);
        show = (Button)findViewById(`enter code here`R.id.button);

        show.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Task retrieveData = (Task) new Task().execute();
            }
        });
    }

    class Task extends AsyncTask<Void, Void, Void> {
        String records = "", error = "";

        /*final TextView textShow = findViewById(R.id.textView);
        final TextView textShow2 = findViewById(R.id.textView2);

        static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
        //static final String DB_URL = "jdbc:mysql://" + ConnectURL.DATABASE_URL + "/" + ConnectURL.DATABASE_NAME

        @Override
        protected void onPreExcute(){
            String Xmsg= "Connecting to database...";
            textShow.setText(Xmsg);
        }*/
        @Override
        protected Void doInBackground(Void... voids) {
            Connection conn = null;
            Statement stmt = null;

            try {
                Class.forName("com.mysql.cj.jdbc.Driver");
          
         conn =DriverManager.getConnection("jdbc:mysql://192.168.0.124:3306/android","andro","1234");
                stmt = conn.createStatement();
                **when i debug the emulator stop here and crashed**
                ResultSet resultSet = statement.executeQuery("Select * FROM table_name");

                while (rs.next()) {
                    records += rs.getString(1) + " " + rs.getString(2) + "\n";
                }
            } catch (Exception e) {
                error = e.toString();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            text.setText(records);
            if (error != "")
                errorText.setText(error);
            super.onPostExecute(aVoid);
        }
    }
}

这是我的activity_main.xml我觉得这里没什么问题

<TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="TextView"
    android:textSize="24sp"
    app:layout_constraintBottom_toTopOf="@+id/button"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Show Records"
    android:textSize="24sp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<TextView
    android:id="@+id/textView2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="TextView2"
    android:textSize="24sp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/button" />

这是我从 logcat 得到的信息

2021-04-28 15:01:32.162 5615-5660/de.vogella.mysql.androidmysql E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
    Process: de.vogella.mysql.androidmysql, PID: 5615
    java.lang.RuntimeException: An error occurred while executing doInBackground()
        at android.os.AsyncTask$4.done(AsyncTask.java:415)
        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:305)
        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:923)
     Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Ljava/sql/SQLType;
        at com.mysql.cj.jdbc.DatabaseMetaData.getInstance(DatabaseMetaData.java:765)
        at com.mysql.cj.jdbc.ConnectionImpl.getMetaData(ConnectionImpl.java:1175)
        at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:444)
        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 de.vogella.mysql.androidmysql.MainActivity$Task.doInBackground(MainActivity.java:61)
        at de.vogella.mysql.androidmysql.MainActivity$Task.doInBackground(MainActivity.java:40)
        at android.os.AsyncTask$3.call(AsyncTask.java:394)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:305) 
        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:923) 
     Caused by: java.lang.ClassNotFoundException: Didn't find class "java.sql.SQLType" on path: DexPathList[[zip file "/data/app/~~X8MIj6EwtZt9_UXjh82Wmg==/de.vogella.mysql.androidmysql--7dPP3pspOuT7aIGSh_6jg==/base.apk"],nativeLibraryDirectories=[/data/app/~~X8MIj6EwtZt9_UXjh82Wmg==/de.vogella.mysql.androidmysql--7dPP3pspOuT7aIGSh_6jg==/lib/x86, /system/lib, /system_ext/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:207)
        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:765) 
        at com.mysql.cj.jdbc.ConnectionImpl.getMetaData(ConnectionImpl.java:1175) 
        at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:444) 
        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 de.vogella.mysql.androidmysql.MainActivity$Task.doInBackground(MainActivity.java:61) 
        at de.vogella.mysql.androidmysql.MainActivity$Task.doInBackground(MainActivity.java:40) 
        at android.os.AsyncTask$3.call(AsyncTask.java:394) 
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:305) 
        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:923) 
2021-04-28 15:01:32.349 5615-5660/de.vogella.mysql.androidmysql I/Process: Sending signal. PID: 5615 SIG: 9

【问题讨论】:

  • 可以分享一下logcat吗
  • 是的,当然。我已经上传了

标签: java android mysql crash


【解决方案1】:

显然您的代码没问题,问题在于您正在使用的驱动程序库“com.mysql.cj.jdbc.Driver”,您确定您已正确定义类路径,这也可能对您有所帮助https://*.com/a/59867655/9502601

【讨论】:

  • 我使用最新版本的 mysql-connector,然后我降级到旧版本 5.1.46 仍然不能。我能知道类路径在哪里定义吗?