我正在 Java 中使用 SQLite 创建费用跟踪器,将 JDBC 和 SLF4J 添加到项目类路径后,出现此错误;
未找到适合 jdbc:sqlite:expenses.db 的驱动程序
我已确认 SLF4J 和 JDBC 位于该项目的类路径中。
这是我的代码;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
public class ExpensesTracker extends JFrame implements ActionListener {
private JTextField expenseField, amountField;
private JButton addButton, deleteButton;
private JTable expenseTable;
private DefaultTableModel tableModel;
private Connection connection;
public ExpensesTracker() {
setTitle("Expense Tracker");
setSize(600, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
JPanel topPanel = new JPanel(new FlowLayout());
expenseField = new JTextField(20);
amountField = new JTextField(10);
addButton = new JButton("Add");
deleteButton = new JButton("Delete");
topPanel.add(new JLabel("Expense:"));
topPanel.add(expenseField);
topPanel.add(new JLabel("Amount:"));
topPanel.add(amountField);
topPanel.add(addButton);
topPanel.add(deleteButton);
String[] columnNames = {"Expense", "Amount"};
tableModel = new DefaultTableModel(columnNames, 0);
expenseTable = new JTable(tableModel);
JScrollPane scrollPane = new JScrollPane(expenseTable);
add(topPanel, BorderLayout.NORTH);
add(scrollPane, BorderLayout.CENTER);
addButton.addActionListener(this);
deleteButton.addActionListener(this);
try {
connection = DriverManager.getConnection("jdbc:sqlite:expenses.db");
refreshTable();
} catch (Exception e) {
e.printStackTrace();
}
}
private void refreshTable() {
tableModel.setRowCount(0);
try {
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * FROM expenses");
while (resultSet.next()) {
String expense = resultSet.getString("expense");
double amount = resultSet.getDouble("amount");
tableModel.addRow(new Object[]{expense, amount});
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == addButton) {
String expense = expenseField.getText();
double amount = Double.parseDouble(amountField.getText());
try {
PreparedStatement statement = connection.prepareStatement("INSERT INTO expenses (expense, amount) VALUES (?, ?)");
statement.setString(1, expense);
statement.setDouble(2, amount);
statement.executeUpdate();
refreshTable();
expenseField.setText("");
amountField.setText("");
} catch (Exception ex) {
ex.printStackTrace();
}
} else if (e.getSource() == deleteButton) {
int selectedRow = expenseTable.getSelectedRow();
if (selectedRow != -1) {
String expense = (String) tableModel.getValueAt(selectedRow, 0);
try {
PreparedStatement statement = connection.prepareStatement("DELETE FROM expenses WHERE expense = ?");
statement.setString(1, expense);
statement.executeUpdate();
refreshTable();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new ExpensesTracker().setVisible(true);
}
});
}
}
关于如何解决这个问题有什么想法吗?
我也尝试按照 github 上的建议恢复到 SLF4J 版本 1.7,但仍然遇到相同的错误。
错误消息“没有找到适合 jdbc:sqlite:expenses.db 的驱动程序”表示您的应用程序无法找到适合 SQLite 的 JDBC 驱动程序。要解决此问题,您需要:
classpath
jdbc:sqlite:sqlite_database_file_path
,其中 sqlite_database_file_path
是 SQLite 数据库文件的实际路径。