mardi 27 janvier 2015

Java (Eclipse) + SQLite // Database Locked //Can't close after SELECT

I'm working in a project that involves Java and SQLite and i´m in serious troubles: I can make SELECT querys without any problem but after that, if I try to make an INSERT I get the Database Locked error. I have been reading about it and I think that i'm not closing propperly after the SELECT, but i have tried different ways and i haven't been able to make it work.


My project has a Class for the connection and another one for the operations (load user, load film...):



import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.JOptionPane;

public class Conexion {

Connection conexion;
Statement consulta;
public String ruta;

public Conexion(){
//ruta="/SolucionJuego/JuegoADT.db";
//ruta="C:/Eclipses/Luna-ADT/workspace/SolucionJuego/JuegoADT.db";
//ruta="D:/eclipse-java-luna-R-win32/WorkspaceADTProyecto/SolucionJuego/JuegoADT.db";


ruta="G:/WS/workspacePortatil/JuegoADT/JuegoADT.db";
}

public void conectar(){
try {
Class.forName("org.sqlite.JDBC");
} catch (ClassNotFoundException e) {
JOptionPane.showMessageDialog(null, e.getMessage());
}
try {
conexion=DriverManager.getConnection("jdbc:sqlite:"+ruta);
consulta=conexion.createStatement();
System.out.println("Conexion exitosa");
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, e.getMessage());
}
}

public void desconectar(){
try {
conexion.close();
} catch (Exception e) {
// TODO: handle exception
}
}

}


And here the operations



import java.sql.ResultSet;
import java.sql.SQLException;

import clases.Frase;
import clases.Pelicula;
import clases.Personaje;
import clases.Puntuacion;
import clases.Usuario;

import javax.swing.JOptionPane;

public class Operaciones extends Conexion{

public Operaciones(){

}

public boolean insertar(String sql){
boolean valor=true;
conectar();
try {
consulta.executeUpdate(sql);
} catch (SQLException e) {
valor=false;
JOptionPane.showMessageDialog(null, e.getMessage());

}
finally{
try {
consulta.close();
conexion.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return valor;
}

public ResultSet consultar(String sql){
conectar();
ResultSet resultado=null;
try {
resultado=consulta.executeQuery(sql);

} catch (SQLException e) {
System.out.println("Mensaje: "+e.getMessage());
System.out.println("Estado: "+e.getSQLState());
System.out.println("Codigo del error: "+e.getErrorCode());
JOptionPane.showMessageDialog(null, ""+e.getMessage());
}

return resultado;

}

public void registroUsuario(Usuario usuario){
insertar("insert into Usuarios values("+usuario.getUserId()
+", '"+usuario.getUserName()
+", '"+usuario.getUserPass()+"');");
}

public void insertaPuntuacion(Puntuacion puntuacion){
insertar("insert into Puntuaciones(userId, userName, numPrueba, puntuacion) values("+puntuacion.getUserId()
+", '"+puntuacion.getUserName()
+"', "+puntuacion.getNumPrueba()
+", "+puntuacion.getPuntos()+");");
}

public int miraPuntuacion(int num){
int puntuacion=0;
String sql="Select puntuacion from Puntuaciones where userId="+num+";";
try {
puntuacion=consultar(sql).getInt("tiempo");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


return puntuacion;
}
public void sumarPuntuacion(Puntuacion puntuacion){

}

public Pelicula cargarPelicula(int num){
Pelicula aux=new Pelicula();
String sql="Select * from Peliculas where idPelicula ="+num+";";

try {
aux.setIdPeli(consultar(sql).getInt("idPelicula"));
aux.setNombrePeli(consultar(sql).getString("nombrePelicula"));
aux.setRutaPeli(consultar(sql).getString("imagenPelicula"));


} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return aux;
}

public Frase cargarFrase(int num){
Frase aux=new Frase();
String sql="Select * from Frases where idFrase ="+num+";";

try {
aux.setIdFrase(consultar(sql).getInt("idFrase"));
aux.setFrase(consultar(sql).getString("frase"));
aux.setPeliFrase(consultar(sql).getString("peliculaFrase"));


} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return aux;
}

public Personaje cargarPersonaje(int num){
Personaje aux=new Personaje();
String sql="Select * from Peliculas where idPelicula ="+num+";";

try {
aux.setIdPers(consultar(sql).getInt("idPersonaje"));
aux.setNombrePers(consultar(sql).getString("nombrePersonaje"));
aux.setRutaPers(consultar(sql).getString("imagenPersonaje"));


} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return aux;
}

public Puntuacion cargarPuntuacion(int num){
Puntuacion aux=new Puntuacion();
String sql="Select * from Puntuaciones where UserId ="+num+";";

try {
aux.setUserId(consultar(sql).getInt("userId"));
aux.setUserName(consultar(sql).getString("userName"));
aux.setNumPrueba(consultar(sql).getInt("numPrueba"));
aux.setPuntos(consultar(sql).getInt("tiempo"));


} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return aux;
}

public Usuario cargarUsuario(String nombre){
Usuario aux=new Usuario();
String sql="Select userId, nombreUsuario, password from Usuarios where nombreUsuario ='"+ nombre+"';";

try {
aux.setUserId(consultar(sql).getInt("userId"));
aux.setUserName(consultar(sql).getString("nombreUsuario"));
aux.setUserPass(consultar(sql).getString("password"));
System.out.println(aux.getUserName());

} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return aux;
}
public Usuario cargarUsuario(int num){
Usuario aux=new Usuario();
String sql="Select * from Usuarios where userId ="+num+";";

try {
aux.setUserId(consultar(sql).getInt("userId"));
aux.setUserName(consultar(sql).getString("nombreUsuario"));
aux.setUserPass(consultar(sql).getString("password"));


} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return aux;
}
}


Anyone could help? Thanks!!


Edit: Maybe there is any error in the INSERT part and that's the cause of the error instead of the closing after select, but i can't find it


Aucun commentaire:

Enregistrer un commentaire