Java y SQLite [cerrado]


333

Me atrae la pulcritud que proporciona una base de datos de un solo archivo. Qué biblioteca de controladores / conectores hay para conectar y usar SQLite con Java.

He descubierto una biblioteca de contenedor, http://www.ch-werner.de/javasqlite , pero ¿hay otros proyectos más destacados disponibles?


10
Me encanta que una pregunta con cientos de votos a favor, y respuestas que tienen cientos de votos a favor, esté cerrada como "fuera de tema". Es un poco embarazoso, jajaja
Andrew Koster

Respuestas:


196

La wiki enumera algunos envoltorios más:


77
Mi adición a esta lista es sqlite4java - code.google.com/p/sqlite4java - es un contenedor (sin JDBC); precompilado para Windows, Mac, Linux. Es simple de usar y aplica algunos contratos para ayudar al desarrollador a evitar el uso indebido de SQLite.
sereda

77
sqlite4java parece interesante, pero también tienen una gran comparación de los diversos envoltorios disponibles: code.google.com/p/sqlite4java/wiki/ComparisonToOtherWrappers
Scott Bennett-McLeish

1
@kdt, el problema que encontré con el controlador zentus es que no parece admitir BLOB en absoluto
Martijn

12
@Martijn xerial.org/trac/Xerial/wiki/SQLiteJDBC es una bifurcación del controlador de zentus y admite BLOB (hay un breve resumen en su sitio).
johnharris85


247

Encontré su pregunta mientras buscaba información con SQLite y Java. Solo pensé en agregar mi respuesta, que también publiqué en mi blog .

Llevo un tiempo codificando en Java. También he conocido SQLite pero nunca lo usé ... Bueno, lo he usado a través de otras aplicaciones pero nunca en una aplicación que codifiqué. ¡Así que lo necesitaba para un proyecto esta semana y es tan simple de usar!

Encontré un controlador JDBC de Java para SQLite. Simplemente agregue el archivo JAR a su classpath e importe java.sql. *

Su aplicación de prueba creará un archivo de base de datos, enviará algunos comandos SQL para crear una tabla, almacenará algunos datos en la tabla y los leerá y mostrará en la consola. Se va a crear el test.db archivo en el directorio raíz del proyecto. Puede ejecutar este ejemplo con java -cp .:sqlitejdbc-v056.jar Test.

package com.rungeek.sqlite;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

public class Test {
    public static void main(String[] args) throws Exception {
        Class.forName("org.sqlite.JDBC");
        Connection conn = DriverManager.getConnection("jdbc:sqlite:test.db");
        Statement stat = conn.createStatement();
        stat.executeUpdate("drop table if exists people;");
        stat.executeUpdate("create table people (name, occupation);");
        PreparedStatement prep = conn.prepareStatement(
            "insert into people values (?, ?);");

        prep.setString(1, "Gandhi");
        prep.setString(2, "politics");
        prep.addBatch();
        prep.setString(1, "Turing");
        prep.setString(2, "computers");
        prep.addBatch();
        prep.setString(1, "Wittgenstein");
        prep.setString(2, "smartypants");
        prep.addBatch();

        conn.setAutoCommit(false);
        prep.executeBatch();
        conn.setAutoCommit(true);

        ResultSet rs = stat.executeQuery("select * from people;");
        while (rs.next()) {
            System.out.println("name = " + rs.getString("name"));
            System.out.println("job = " + rs.getString("occupation"));
        }
        rs.close();
        conn.close();
    }
  }

1
Es por eso que creo que Joel estaba hablando toro (Google tech talk: youtube.com/watch?v=NWHfY_lvKIQ ) al decir que el diseño de stackoverflow.com es mejor debido a todas las publicaciones "antiguas" que hay en Internet. Es solo una repetición.
Nikolaos

26
Observe también que el proyecto Crawshaw parece estar en pausa, pero se bifurcó y actualizó aquí: xerial.org/trac/Xerial/wiki/SQLiteJDBC
lapo

8
zentus.com parece roto, encontrado espejo aquí; priede.bf.lu.lv/pub/DatuBazes/SQLite/SqliteJDBC/about.htm
Daniel Magnusson

3
Gracias @DanielMagnusson, eres un salvavidas. Mientras se trata el tema, cualquiera que siga buscando el controlador sqliteJDBC puede ir a priede.bf.lu.lv/pub/DatuBazes/SQLite/SqliteJDBC/… ya que el enlace al que se vincula about.htm es incorrecto.
javatarz


30

Entiendo que preguntaste específicamente sobre SQLite, pero tal vez la base de datos HSQL encajaría mejor con Java. Está escrito en Java, se ejecuta en la JVM, admite tablas en memoria, etc. y todas esas características lo hacen bastante útil para la creación de prototipos y pruebas unitarias.


3
Sí, HSQL es una muy buena opción y la he usado ampliamente en un par de aplicaciones cliente para obtener buenos resultados. Sin embargo, en este caso, sí quería usar SQLite.
Scott Bennett-McLeish el

18

El proyecto David Crawshaw (sqlitejdbc-v056.jar) parece desactualizado y la última actualización fue el 20 de junio de 2009, fuente aquí

Se lo recomiendo Xerials tenedor del envoltorio Crawshaw SQLite. Reemplacé sqlitejdbc-v056.jar con el archivo Xerials sqlite-jdbc-3.7.2.jar sin ningún problema.

Utiliza la misma sintaxis que en la respuesta de Bernie y es mucho más rápido y con la última biblioteca sqlite.

¿Qué es diferente del SQLite JDBC de Zentus?

El controlador JDBC SQLite de Zentus original http://www.zentus.com/sqlitejdbc/ es una excelente utilidad para usar bases de datos SQLite desde el lenguaje Java, y nuestra biblioteca SQLiteJDBC también se basa en su implementación. Sin embargo, su versión de java puro, que traduce totalmente los códigos c / c ++ de SQLite a Java, es significativamente más lenta en comparación con su versión nativa, que utiliza binarios de SQLite compilados para cada sistema operativo (win, mac, linux).

Para usar la versión nativa de sqlite-jdbc, el usuario tenía que establecer una ruta a los códigos nativos (dll, jnilib, archivos, que son programas JNDI C) utilizando argumentos de línea de comandos, por ejemplo, -Djava.library.path = (ruta a la dll, jnilib, etc.), o -Dorg.sqlite.lib.path, etc. Este proceso fue propenso a errores y molesto para decirle a cada usuario que establezca estas variables. Nuestra biblioteca SQLiteJDBC elimina por completo estos inconvenientes.

Otra diferencia es que estamos manteniendo este libite SQLiteJDBC actualizado a la versión más nueva del motor SQLite, porque somos uno de los usuarios más populares de esta biblioteca. Por ejemplo, SQLite JDBC es un componente central de UTGB (University of Tokyo Genome Browser) Toolkit, que es nuestra utilidad para crear navegadores genómicos personalizados.

EDITAR : como de costumbre cuando actualiza algo, habrá problemas en algún lugar oscuro en su código (me pasó a mí). Prueba prueba prueba =)


1
El sqlite-jdbcproyecto es excelente, pero tenga en cuenta que tiene licencia de Apache . Por lo tanto, debe atribuirlo si lo usa, ya sea que su código sea FOSS o propietario.
dotancohen

16

Hay un nuevo proyecto SQLJet que es una implementación pura de Java de SQLite. Todavía no es compatible con todas las características de SQLite, pero puede ser una muy buena opción para algunos de los proyectos Java que funcionan con bases de datos SQLite.


44
Parece prometedor, pero parece que todavía no ofrece una capacidad de consulta SQL, lo que es un factor decisivo para mí.
Scott Bennett-McLeish

Todavía no admite consultas SQL, sino una API de nivel inferior.
Basilea Shishani

Sigue siendo muy útil para aplicaciones donde solo necesita generar archivos SQLite, es decir, no necesita SQL para consultar los datos.
El alquimista

5

La publicación de Bernie es muy útil. No se pudo votar (no tiene suficiente reputación :(). Pero ayudó mucho. ¡Solo para reiterar!

http://www.zentus.com/sqlitejdbc/

Aquí puede encontrar el último jar JDBC de SQLite. ¡Solo agrega el frasco en tu classpath y listo! :) Puedes ejecutar el código de muestra de Bernie para probar si todo está bien.

http://souptonuts.sourceforge.net/readme_sqlite_tutorial.html http://www.sqlite.org/lang.html

Aquí puede encontrar ayuda sobre la sintaxis SQL para SQLite. Saludos a SQLite :)


3

Cuando compila y ejecuta el código, debe establecer el valor de las opciones de classpath. Al igual que lo siguiente:

javac -classpath .;sqlitejdbc-v056.jar Text.java

java -classpath .;sqlitejdbc-v056.jar Text

Por favor, preste atención a "." y el espaciado ";" (win, el linux es ":")


3

El código sqlitejdbc se puede descargar usando git desde https://github.com/crawshaw/sqlitejdbc .

# git clone https://github.com/crawshaw/sqlitejdbc.git sqlitejdbc
...
# cd sqlitejdbc
# make

Nota: Makefile requiere curl binary para descargar bibliotecas / deps de sqlite.


2

El código de ejemplo conduce a una pérdida de memoria en Tomcat (después de desplegar la aplicación web, el cargador de clases aún permanece en la memoria), lo que outofmemoryeventualmente causará una falla. La forma de resolverlo es usar sqlite-jdbc-3.7.8.jar ; Es una instantánea, por lo que todavía no aparece para Maven.


0

Error de tipografía: java -cp .:sqlitejdbc-v056.jar Test

debiera ser: java -cp .:sqlitejdbc-v056.jar; Test

observe el punto y coma después de ".jar", espero que ayude a las personas, podría causar mucha molestia


¿Cuidado para elaborar? En * nix the; separará el java del comando Prueba (y, por lo tanto, creará un error). En Windows, el: no funcionará como separador de cp. Así que, en general .:xxx.jar;, no tiene sentido. Y también debe especificar el nombre del paquete para la clase Test.
Eckes
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.