当应用程序尝试在单击按钮时从 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 权限。请放弃一些解决方案,因为实现这一点对我来说很重要......谢谢