Olá pessoal, estou com dificuldades em entender qual o erro que foi gerado durante a criação do banco de dados do SQLite. Minha aplicação é em JavaFX e estou aprendendo a usar banco de dados em aplicações Java agora.
O código segue abaixo.
O erro é: java.sql.SQLException: Values not bound to statement
Minha Main.java
package controller;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import model.Veiculo;
import model.sqlite.VeiculoSQLite;
import java.util.ArrayList;
public class Main extends Application {
private static Stage stage;
private static Scene mainScene;
private static Scene datailsScene;
@Override
public void start(Stage primaryStage) throws Exception {
Veiculo veiculo = new Veiculo("Volkswagen","Brasília",60);
VeiculoSQLite database = new VeiculoSQLite();
database.create(veiculo);
System.out.println(database.all());
System.exit(0);
stage = primaryStage;
primaryStage.setTitle("ExemploLOO");
Parent fxmlMain = FXMLLoader.load(getClass().getResource("../view/main_screen.fxml"));
mainScene = new Scene(fxmlMain, 640, 400);
Parent fxmlDetails = FXMLLoader.load(getClass().getResource("../view/details_screen.fxml"));
datailsScene = new Scene(fxmlDetails, 640, 400);
primaryStage.setScene(mainScene);
primaryStage.show();
}
public static void changeScreen(String scr, Object userData){
switch (scr){
case "main":
stage.setScene(mainScene);
notifyAllListeners("main", userData);
break;
case "details":
stage.setScene(datailsScene);
notifyAllListeners("details", userData);
break;
}
}
public static void changeScreen(String scr){
changeScreen(scr, null);
}
public static void main(String[] args) {
launch(args);
}
//----------- Observer
private static ArrayList<OnChangeScreen> listeners = new ArrayList<>();
public static interface OnChangeScreen{
void onScreenChanged(String newScreen, Object userData);
}
public static void addOnChangeScreenListener(OnChangeScreen newListener){
listeners.add(newListener);
}
private static void notifyAllListeners(String newScreen, Object userData){
for(OnChangeScreen l : listeners)
l.onScreenChanged(newScreen, userData);
}
}
Minha base p/ o SQLite
package model.sqlite;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class SQLiteBase {
protected Connection conn;
public Connection open(){
try {
conn = DriverManager.getConnection("jdbc:sqlite:my_database");
return conn;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public void close(){
if (conn != null)
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
A classe que tem o objeto que trabalha com o BD
package model.sqlite;
import model.Veiculo;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class VeiculoSQLite extends SQLiteBase{
public VeiculoSQLite(){
open();
try {
PreparedStatement stm = conn.prepareStatement( "CREATE TABLE IF NOT EXISTS Veiculos ("+
"id INTEGER PRIMARY KEY AUTOINCREMENT,"+
"marca TEXT," +
"modelo TEXT," +
"hp INTEGER);");
stm.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
close();
}
}
public void create(Veiculo v){
open();
try {
PreparedStatement stm = conn.prepareStatement("INSERT INTO Veiculos VALUES (?,?,?,?);");
stm.setString(2,v.getMarca());
stm.setString(3,v.getModelo());
stm.setInt(4,v.getHp());
stm.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
close();
}
}
public List<Veiculo>all(){
ArrayList<Veiculo> result = new ArrayList<>();
open();
try {
PreparedStatement stm = conn.prepareStatement("SELECT * FROM Veiculos ORDER BY id ASC;");
ResultSet rs = stm.executeQuery();
while (rs.next()){
Veiculo v = new Veiculo(
rs.getInt(1),//id
rs.getString(2),//marca
rs.getString(3),//modelo
rs.getInt(4));//hp
result.add(v);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
close();
}
return result;
}
}
Se alguém puder me dar uma luz eu agradeço muito.
Até mais