Android 应用程序在尝试从 mysql 数据库获取数据时自动关闭

问题描述 投票:0回答:0

当应用程序尝试在单击按钮时从 mysql 数据库中获取数据时,应用程序会自动关闭,如果提供了不正确的数据库凭据,它会给出错误消息,但当一切正确时会崩溃。我附上了 MainActivity.java 代码。

MainActivity.java

package com.example.mysqlapp;

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 java.sql.*;



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(R.id.button);

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

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

        @Override
        protected Void doInBackground(Void... voids) {
            try
            {
                Class.forName("com.mysql.jdbc.Driver");
                Connection connection = DriverManager.getConnection("jdbc:mysql://192.168.1.132:3306/android", "andro", "andro");
                Statement statement = connection.createStatement();
                ResultSet resultSet = statement.executeQuery("SELECT * FROM test");
                while(resultSet.next()) {
                    records += resultSet.getString(1) + " " + resultSet.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

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:orientation="vertical"
    android:padding="5dp">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="87dp"
        android:layout_marginTop="108dp"
        android:text="test text"
        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:layout_marginTop="264dp"
        android:layout_marginEnd="109dp"
        android:text="show records"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="84dp"
        android:layout_marginBottom="237dp"
        android:text="no error"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

错误日志

2023-03-28 09:34:48.493 17736-17766/com.example.mysqlapp E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
    Process: com.example.mysqlapp, PID: 17736
    java.lang.RuntimeException: An error occurred while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:354)
        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:245)
        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:764)
     Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Ljava/sql/SQLType;
        at com.mysql.cj.jdbc.DatabaseMetaData.getInstance(DatabaseMetaData.java:768)
        at com.mysql.cj.jdbc.ConnectionImpl.getMetaData(ConnectionImpl.java:1165)
        at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:435)
        at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:237)
        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.mysqlapp.MainActivity$Async.doInBackground(MainActivity.java:42)
        at com.example.mysqlapp.MainActivity$Async.doInBackground(MainActivity.java:34)
        at android.os.AsyncTask$2.call(AsyncTask.java:333)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245) 
        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:764) 
     Caused by: java.lang.ClassNotFoundException: Didn't find class "java.sql.SQLType" on path: DexPathList[[zip file "/data/app/com.example.mysqlapp-9Tqkv0isaA2hOSSCrcw3Ew==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.mysqlapp-9Tqkv0isaA2hOSSCrcw3Ew==/lib/x86, /system/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
        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:768) 
        at com.mysql.cj.jdbc.ConnectionImpl.getMetaData(ConnectionImpl.java:1165) 
        at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:435) 
        at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:237) 
        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.mysqlapp.MainActivity$Async.doInBackground(MainActivity.java:42) 
        at com.example.mysqlapp.MainActivity$Async.doInBackground(MainActivity.java:34) 
        at android.os.AsyncTask$2.call(AsyncTask.java:333) 
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245) 
        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:764) 
2023-03-28 09:34:48.964 17736-17762/com.example.mysqlapp D/EGL_emulation: eglMakeCurrent: 0xe5085300: ver 2 0 (tinfo 0xe5083340)

当我通过 xampp 服务器使用 sql 数据库时,发生了同样的事情。我在 libs 目录中将 mysql-connector.jar 文件添加为库,并授予了 Internet 权限。请放弃一些解决方案,因为实现这一点对我来说很重要......谢谢

java mysql-connector
© www.soinside.com 2019 - 2024. All rights reserved.