Java e SQLite [chiuso]


333

Sono attratto dalla pulizia che offre un singolo database di file. Quale libreria driver / connettore è disponibile per connettersi e utilizzare SQLite con Java.

Ho scoperto una libreria wrapper, http://www.ch-werner.de/javasqlite , ma ci sono altri progetti più importanti disponibili?


10
Adoro il fatto che una domanda con centinaia di voti e risposte che hanno centinaia di voti sia chiusa come "off-topic". È un po 'imbarazzante, lol
Andrew Koster,

Risposte:


196

Il wiki elenca altri wrapper:


7
La mia aggiunta a questo elenco è sqlite4java - code.google.com/p/sqlite4java - è un wrapper (no JDBC); precompilato per Windows, Mac, Linux. È semplice da usare e applica alcuni contratti per aiutare lo sviluppatore a evitare l'uso improprio di SQLite.
Sereda,

7
sqlite4java sembra interessante, ma hanno anche un ottimo confronto tra i vari wrapper disponibili: code.google.com/p/sqlite4java/wiki/ComparisonToOtherWrappers
Scott Bennett-McLeish,

1
@kdt il problema che ho riscontrato con il driver zentus è che non sembra supportare affatto i BLOB
Martijn,

12
@Martijn xerial.org/trac/Xerial/wiki/SQLiteJDBC è un fork del driver di zentus e supporta BLOB (c'è un breve tutorial sul loro sito).
johnharris85,


247

Ho trovato la tua domanda durante la ricerca di informazioni con SQLite e Java. Ho pensato di aggiungere la mia risposta che ho anche pubblicato sul mio blog .

Ho programmato in Java per un po 'di tempo. Conosco anche SQLite ma non l'ho mai usato ... Beh, l'ho usato attraverso altre applicazioni ma mai in un'app che ho codificato. Quindi ne avevo bisogno per un progetto questa settimana ed è così semplice da usare!

Ho trovato un driver JDBC Java per SQLite. Aggiungi semplicemente il file JAR al tuo percorso di classe e importa java.sql. *

La sua app di test creerà un file di database, invierà alcuni comandi SQL per creare una tabella, memorizzerà alcuni dati nella tabella e li rileggerà e li visualizzerà sulla console. Si creerà il test.db file nella directory principale del progetto. Puoi eseguire questo esempio 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
Questo è il motivo per cui penso che Joel stesse parlando di toro (Google Tech Talk: youtube.com/watch?v=NWHfY_lvKIQ ) quando ha detto che il design di stackoverflow.com è migliore a causa di tutti i "vecchi" post in giro su Internet. È solo una rehash.
Nikolaos,

26
Si noti inoltre che il progetto Crawshaw sembra in pausa, ma è stato biforcuto e aggiornato qui: xerial.org/trac/Xerial/wiki/SQLiteJDBC
lapo

8
zentus.com sembra rotto, trovato specchio qui; priede.bf.lu.lv/pub/DatuBazes/SQLite/SqliteJDBC/about.htm
Daniel Magnusson

3
Grazie @DanielMagnusson, sei un salvavita. Sull'argomento, chiunque stia ancora cercando il driver sqliteJDBC può andare su priede.bf.lu.lv/pub/DatuBazes/SQLite/SqliteJDBC/… poiché il collegamento al link about.htm non è corretto.
javatarz,


30

Capisco che tu abbia chiesto specificamente di SQLite, ma forse il database HSQL sarebbe più adatto a Java. È scritto in Java stesso, funziona nella JVM, supporta tabelle in memoria ecc. E tutte quelle caratteristiche lo rendono abbastanza utilizzabile per la prototipazione e il testing di unità.


3
Sì, HSQL è un'ottima scelta e l'ho usato abbastanza ampiamente in un paio di app client per ottenere buoni risultati. In questo caso, tuttavia, volevo davvero usare SQLite.
Scott Bennett-McLeish,

18

Il progetto David Crawshaw (sqlitejdbc-v056.jar) sembra obsoleto e l'ultimo aggiornamento è stato il 20 giugno 2009, fonte qui

Consiglierei la forcella Xerials dell'involucro sqlite di Crawshaw. Ho sostituito sqlitejdbc-v056.jar con il file Xerials sqlite-jdbc-3.7.2.jar senza alcun problema.

Utilizza la stessa sintassi della risposta di Bernie ed è molto più veloce e con l'ultima libreria sqlite.

Cosa differisce dal JDBC SQLite di Zentus?

Il driver JDBC SQLite originale di Zentus http://www.zentus.com/sqlitejdbc/ è di per sé un'utilità eccellente per l'utilizzo di database SQLite dal linguaggio Java e la nostra libreria SQLiteJDBC si basa anche sulla sua implementazione. Tuttavia, la sua versione pure-java, che traduce totalmente i codici c / c ++ di SQLite in Java, è significativamente più lenta rispetto alla sua versione nativa, che utilizza i binari SQLite compilati per ciascun sistema operativo (win, mac, linux).

Per utilizzare la versione nativa di sqlite-jdbc, l'utente ha dovuto impostare un percorso per i codici nativi (dll, jnilib, quindi i file, che sono programmi JNDI C) utilizzando argomenti della riga di comando, ad esempio -Djava.library.path = (percorso alla dll, jnilib, ecc.) o -Dorg.sqlite.lib.path, ecc. Questo processo era soggetto a errori e fastidioso dire a ogni utente di impostare queste variabili. La nostra libreria SQLiteJDBC elimina completamente questi inconvenienti.

Un'altra differenza è che stiamo mantenendo questo libray SQLiteJDBC aggiornato alla versione più recente del motore SQLite, perché siamo uno degli utenti più alla moda di questa libreria. Ad esempio, SQLite JDBC è un componente chiave del Toolkit UTGB (University of Tokyo Genome Browser), che è la nostra utility per creare browser genomici personalizzati.

EDIT : Come al solito quando aggiorni qualcosa, ci saranno problemi in qualche posto oscuro nel tuo codice (mi è successo). Test test test =)


1
Il sqlite-jdbcprogetto è fantastico, ma tieni presente che è concesso in licenza Apache . Pertanto, è necessario assegnare l'attribuzione se lo si utilizza, sia che il codice sia FOSS o proprietario.
dotancohen,

16

C'è un nuovo progetto SQLJet che è una pura implementazione Java di SQLite. Non supporta ancora tutte le funzionalità di SQLite, ma potrebbe essere un'ottima opzione per alcuni dei progetti Java che funzionano con i database SQLite.


4
Sembra promettente, ma sembra che non offra ancora una capacità di query SQL, un po 'una rottura di affare per me.
Scott Bennett-McLeish,

Non supporta ancora le query SQL, piuttosto un'API di livello inferiore.
Basilea Shishani,

Ancora molto utile per le applicazioni in cui è necessario solo generare file SQLite, ovvero non è necessario SQL per eseguire query sui dati.
The Alchemist

5

Il post di Bernie è molto utile. Impossibile votare (non avere abbastanza reputazione :(). Ma mi ha aiutato molto. Solo per ribadire!

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

Qui puoi trovare il JDBC SQLite più recente. Basta aggiungere il vaso nel tuo percorso di classe e il gioco è fatto! :) Puoi eseguire il codice di esempio di Bernie per verificare se tutto va bene.

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

Qui puoi trovare un aiuto sulla sintassi SQL per SQLite. Saluti a SQLite :)


3

Quando si compila ed esegue il codice, è necessario impostare il valore delle opzioni del percorso di classe. Proprio come il seguente:

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

java -classpath .;sqlitejdbc-v056.jar Text

Si prega di prestare attenzione a "." e lo sparato ";" (win, il linux è ":")


3

Il codice sqlitejdbc può essere scaricato usando git da https://github.com/crawshaw/sqlitejdbc .

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

Nota: Makefile richiede curl binary per scaricare librerie / deps sqlite.


2

Il codice di esempio porta a una perdita di memoria in Tomcat (dopo aver rimosso la distribuzione dell'app Web, il classloader rimane ancora in memoria) che causerà un outofmemory alla fine errore. Il modo per risolverlo è usare sqlite-jdbc-3.7.8.jar ; è un'istantanea, quindi non appare ancora per Maven.


0

Typo: java -cp .:sqlitejdbc-v056.jar Test

dovrebbe essere: java -cp .:sqlitejdbc-v056.jar; Test

notare il punto e virgola dopo ".jar" spero che aiuti le persone, potrebbe causare molta seccatura


Ti interessa elaborare? Su * nix il; separerà java dal comando Test (e quindi creerà un errore). Su Windows: non funzionerà come separatore cp. Quindi tutto sommato .:xxx.jar;non ha senso. E devi anche specificare il nome del pacchetto per la classe Test.
Verifica il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.