java - studio - No se encontrĂ³ un controlador adecuado(SQLite)
android studio pdf 2018 (6)
A su ruta de clase le faltan los archivos jar que contienen las clases y el controlador de sqlite. Necesita algo como sqlite-jdbc-3.7.2.jar o su versión aplicable.
Si está seguro de que el contenedor está allí, intente agregar esta línea de código antes de crear una conexión:
Class.forName("org.sqlite.JDBC");
Espero que alguien pueda ayudarme. Estoy trabajando en una aplicación simple que se conecta con una base de datos SQLite. El siguiente es mi código de conexión:
try {
Connection con = DriverManager.getConnection("jdbc:sqlite:myDB.sqlite");
PreparedStatement pstm = con.prepareStatement("insert into hell(username,pssword) " +
"values (''"+tfUname.getText()+"'',''"+tfUpass.getText()+"'')");
pstm.close();
con.close();
JOptionPane.showMessageDialog(null,"Congrats, you have been registered succesfully");
RegisterWindow rw = new RegisterWindow();
rw.setVisible(false);
pack();
dispose();
} catch(SQLException ex) {
setTitle(ex.toString());
}
Esto es solo una ventana para cargar un nombre de usuario y contraseña en la base de datos. El problema que tengo es que cuando hago clic en el botón aparece la siguiente excepción:
"java.sql.SQLException: No suitable driver found for jdbc:sqlite:C//LoginJava2//myDB.sqlite"
(Encontré un ejemplo sobre cómo conectarse a una base de datos SQLite en Java, el ejemplo que encontré funciona bien)
Este programa lo estoy haciendo en el constructor de ventanas (eclipse). Estoy usando el mismo controlador que uso en el ejemplo que encontré. No sé si tengo que usar otro driver. De hecho, lo he intentado con diferentes controladores pero ese mensaje sigue apareciendo.
Hay algo más que solo Class.forName.
En el caso de que hiciera las dos cosas a continuación: - Agregó la biblioteca de sqlite jar a la carpeta lib en su proyecto, haga referencia a ella en la ruta de compilación del proyecto. - Se agregó la declaración Class.forName ("org.sqlite.JDBC"). Y sigue apareciendo el mensaje de error "No hay un controlador adecuado", puede deberse a la ruta de su base de datos. Si está utilizando Windows: en lugar de:
DriverManager.getConnection("D://db//my-db.sqlite").
Deberías usar:
DriverManager.getConnection("jdbc:sqlite:D://db//my-db.sqlite").
El "jdbc: sqlite:" hará el truco.
Si está utilizando Linux, simplemente cambie el carácter del separador: DriverManager.getConnection ("jdbc: sqlite: /your/somepath/my-db.sqlite").
La línea "Class.forName (" org.sqlite.JDBC ");" funciona porque crea una instancia de JDBC que activa el bloque estático de la clase JDBC:
static {
try {
DriverManager.registerDriver(new JDBC());
}
catch (SQLException e) {
e.printStackTrace();
}
}
En lugar de agregar el Class.forname () mencionado anteriormente, debe usar directamente esta línea que tiene el mismo efecto y que es más elegante (porque no crea una instancia de JDBC para nada):
DriverManager.registerDriver(new JDBC());
Me enfrentaba a problemas similares utilizando una configuración simple de gradle de la siguiente manera
apply plugin: ''java''
repositories {
mavenCentral()
}
dependencies {
compile group: ''org.apache.commons'', name: ''commons-lang3'', version: ''3.0''
testCompile group: ''org.junit.jupiter'', name: ''junit-jupiter-api'', version: ''5.2.0''
compile group: ''org.xerial'', name: ''sqlite-jdbc'', version: ''3.23.1''
}
jar {
manifest {
attributes ''Main-Class'': ''rewards.simulator.MainSimulator''
}
}
Más tarde descubrí que Gradle Build estaba creando un jar que no incluía dependencias externas. La siguiente configuración se utilizará para incluir todas las bibliotecas dependientes en el archivo jar resultante, junto con los archivos de origen, para crear un fat-jar:
apply plugin: ''java''
repositories {
mavenCentral()
}
dependencies {
compile group: ''org.apache.commons'', name: ''commons-lang3'', version: ''3.0''
testCompile group: ''org.junit.jupiter'', name: ''junit-jupiter-api'', version: ''5.2.0''
compile group: ''org.xerial'', name: ''sqlite-jdbc'', version: ''3.23.1''
}
jar {
manifest {
attributes ''Main-Class'': ''rewards.simulator.MainSimulator''
}
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
}
Si usas Maven y quieres construir un jar ejecutable, puedes decidir importar el contenido del jar de sqlite en tu propio jar producido:
<plugins>
<!-- any other plugins -->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
<addClasspath>true</addClasspath>
<mainClass>MyPackage.Main</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
No tendrá que agregar una ruta de clase específica o el uso implícito como se propone en las otras respuestas.
Tengo el mismo problema. Utilicé maven y añadí dependencia:
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.15.1
</version>
</dependency>
Se pudo compilar y obtuve:
No se encontró un controlador adecuado para jdbc: sqlite: xx.db
Revisé el classpath y estaba seguro de que sqlite-jdbc-3.15.1.jar estaba allí. Supongo que por alguna razón, la Clase no estaba cargada, no sé por qué. así que agregué
Class.forName ("org.sqlite.JDBC");
al principio de mi código. ¡Funcionó!
Y, elimino la línea de arriba. ¡Aún funciona! Limpié el proyecto y lo reconstruí, ¡no se necesita más Class.forName ()! Todavía no sé por qué. Pero el problema está resuelto. Creo que Class.forName () se puede usar para diagnosticar si la clase que necesita está en el classpath.