Java und SQLite [geschlossen]

333

Ich bin von der Sauberkeit angezogen, die eine einzelne Dateidatenbank bietet. Welche Treiber- / Connector-Bibliothek gibt es, um SQLite mit Java zu verbinden und zu verwenden?

Ich habe eine Wrapper-Bibliothek entdeckt, http://www.ch-werner.de/javasqlite , aber gibt es noch andere prominente Projekte?

Scott Bennett-McLeish
quelle
9
Ich finde es toll, dass eine Frage mit Hunderten von Upvotes und Antworten mit Hunderten von Upvotes als "Off-Topic" geschlossen wird. Es ist irgendwie peinlich, lol
Andrew Koster

Antworten:

196

Das Wiki listet einige weitere Wrapper auf:

Peter Hoffmann
quelle
7
Meine Ergänzung zu dieser Liste ist sqlite4java - code.google.com/p/sqlite4java - es ist ein Wrapper (kein JDBC); vorkompiliert für Windows, Mac, Linux. Es ist einfach zu verwenden und erzwingt einige Verträge, um dem Entwickler zu helfen, den Missbrauch von SQLite zu vermeiden.
Sereda
7
sqlite4java sieht interessant aus, aber sie haben auch einen großartigen Vergleich der verschiedenen Wrapper da draußen: code.google.com/p/sqlite4java/wiki/ComparisonToOtherWrappers
Scott Bennett-McLeish
1
@kdt das Problem, das ich mit dem zentus-Treiber gefunden habe, ist, dass er BLOBs anscheinend überhaupt nicht unterstützt
Martijn
12
@Martijn xerial.org/trac/Xerial/wiki/SQLiteJDBC ist eine Abzweigung des Treibers von zentus und unterstützt BLOB (es gibt eine kurze Anleitung auf ihrer Website).
Johnharris85
17
zentus.com/sqlitejdbc -> 404
m0skit0
247

Ich habe Ihre Frage bei der Suche nach Informationen mit SQLite und Java gefunden. Ich dachte nur, ich würde meine Antwort hinzufügen, die ich auch in meinem Blog gepostet habe .

Ich programmiere jetzt schon eine Weile in Java. Ich habe auch von SQLite gewusst, es aber nie verwendet ... Nun, ich habe es über andere Anwendungen verwendet, aber nie in einer App, die ich codiert habe. Also brauchte ich es diese Woche für ein Projekt und es ist so einfach zu bedienen!

Ich habe einen Java JDBC-Treiber für SQLite gefunden. Fügen Sie einfach die JAR-Datei zu Ihrem Klassenpfad hinzu und importieren Sie java.sql. *

Seine Test-App erstellt eine Datenbankdatei, sendet einige SQL-Befehle zum Erstellen einer Tabelle, speichert einige Daten in der Tabelle und liest sie zurück und zeigt sie auf der Konsole an. Es wird die erstellen test.db Datei im Stammverzeichnis des Projektes. Sie können dieses Beispiel mit ausführen 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();
    }
  }
Bernie Perez
quelle
1
Aus diesem Grund denke ich, dass Joel Bull sprach (Google Tech Talk: youtube.com/watch?v=NWHfY_lvKIQ ), als er sagte, dass das Design von stackoverflow.com besser ist, weil all die "alten" Beiträge im Internet herumhängen. Es ist nur eine Aufarbeitung.
Nikolaos
26
Beachten
Sie
8
zentus.com scheint kaputt zu sein, hier Spiegel gefunden; priede.bf.lu.lv/pub/DatuBazes/SQLite/SqliteJDBC/about.htm
Daniel Magnusson
3
Danke @DanielMagnusson, du bist ein Lebensretter. Während auf dem Thema, noch jemand für den sqliteJDBC Fahrer sucht , kann gehen priede.bf.lu.lv/pub/DatuBazes/SQLite/SqliteJDBC/... zu , da die Verbindung der about.htm Links ist falsch.
Javatarz
2
Maven-Abhängigkeit: mvnrepository.com/artifact/org.xerial/sqlite-jdbc
Carl Bosch
30

Ich verstehe, dass Sie speziell nach SQLite gefragt haben, aber vielleicht passt die HSQL-Datenbank besser zu Java. Es ist in Java selbst geschrieben, läuft in der JVM, unterstützt In-Memory-Tabellen usw. und all diese Funktionen machen es für Prototyping und Unit-Tests gut verwendbar.

Javashlook
quelle
3
Ja, HSQL ist eine sehr gute Wahl, und ich habe es in einigen Client-Apps ziemlich häufig verwendet, um eine gute Wirkung zu erzielen. In diesem Fall wollte ich jedoch tatsächlich SQLite verwenden.
Scott Bennett-McLeish
18

Das David Crawshaw-Projekt (sqlitejdbc-v056.jar) scheint veraltet zu sein und das letzte Update war der 20. Juni 2009, Quelle hier

Ich würde Xerials Gabel von Crawshaw SQLite Wrapper empfehlen . Ich habe sqlitejdbc-v056.jar problemlos durch die Xerials-Datei sqlite-jdbc-3.7.2.jar ersetzt.

Verwendet die gleiche Syntax wie in Bernies Antwort und ist viel schneller und mit der neuesten SQLite-Bibliothek.

Was unterscheidet sich von Zentus SQLite JDBC?

Der ursprüngliche SQLite-JDBC-Treiber von Zentus http://www.zentus.com/sqlitejdbc/ selbst ist ein hervorragendes Dienstprogramm für die Verwendung von SQLite-Datenbanken aus der Java-Sprache, und unsere SQLiteJDBC-Bibliothek hängt auch von seiner Implementierung ab. Die reine Java-Version, die c / c ++ - Codes von SQLite vollständig in Java übersetzt, ist jedoch erheblich langsamer als die native Version, in der für jedes Betriebssystem (win, mac, linux) kompilierte SQLite-Binärdateien verwendet werden.

Um die native Version von sqlite-jdbc zu verwenden, musste der Benutzer mithilfe von Befehlszeilenargumenten, z. B. -Djava.library.path =, einen Pfad zu den nativen Codes (dll, jnilib, also Dateien, die JNDI C-Programme sind) festlegen (Pfad zur DLL, JNILIB usw.) oder -Dorg.sqlite.lib.path usw. Dieser Prozess war fehleranfällig und lästig, um jeden Benutzer anzuweisen, diese Variablen festzulegen. Unsere SQLiteJDBC-Bibliothek beseitigt diese Unannehmlichkeiten vollständig.

Ein weiterer Unterschied besteht darin, dass wir dieses SQLiteJDBC-Libray auf dem neuesten Stand der neuesten Version der SQLite-Engine halten, da wir einer der heißesten Benutzer dieser Bibliothek sind. Beispielsweise ist SQLite JDBC eine Kernkomponente des UTGB-Toolkits (Genome Browser der Universität Tokio), mit dem wir personalisierte Genombrowser erstellen können.

BEARBEITEN : Wie üblich, wenn Sie etwas aktualisieren, wird es an einer dunklen Stelle in Ihrem Code Probleme geben (ist mir passiert). Test Test Test =)

Daniel Magnusson
quelle
1
Das sqlite-jdbcProjekt ist großartig, aber beachten Sie, dass es Apache-lizenziert ist . Daher müssen Sie eine Zuordnung vornehmen, wenn Sie es verwenden, unabhängig davon, ob Ihr Code FOSS oder proprietär ist.
Dotancohen
16

Es gibt ein neues Projekt SQLJet , das eine reine Java-Implementierung von SQLite ist. Es unterstützt noch nicht alle SQLite-Funktionen, ist jedoch möglicherweise eine sehr gute Option für einige der Java-Projekte, die mit SQLite-Datenbanken arbeiten.


quelle
4
Es sieht vielversprechend aus, aber es scheint, dass es noch keine SQL-Abfragefunktion bietet, eine Art Deal Breaker für mich.
Scott Bennett-McLeish
Unterstützt weiterhin keine SQL-Abfragen, sondern eine API niedrigerer Ebene.
Basel Shishani
Immer noch sehr nützlich für Anwendungen, bei denen Sie nur SQLite-Dateien generieren müssen , dh kein SQL zum Abfragen der Daten benötigen.
Der Alchemist
5

Bernies Beitrag ist sehr hilfreich. Konnte nicht abstimmen (habe nicht genug Ruf :(). Aber es hat sehr geholfen. Nur um es noch einmal zu wiederholen!

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

Hier finden Sie die neueste SQLite JDBC-JAR. Fügen Sie einfach das Glas in Ihren Klassenpfad ein und Sie sind fertig! :) Sie können Bernies Beispielcode ausführen, um zu testen, ob alles in Ordnung ist.

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

Hier finden Sie Hilfe zur SQL-Syntax für SQLite. Prost auf SQLite :)

Srinivas
quelle
3

Wenn Sie den Code kompilieren und ausführen, sollten Sie den Wert für die Klassenpfadoptionen festlegen. Genau wie folgt:

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

java -classpath .;sqlitejdbc-v056.jar Text

Achten Sie bitte auf "." und die Sparate ";" (win, das Linux ist ":")

über das Studium
quelle
3

sqlitejdbc-Code kann mit git von https://github.com/crawshaw/sqlitejdbc heruntergeladen werden .

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

Hinweis: Für das Makefile ist eine Curl-Binärdatei erforderlich, um SQLite-Bibliotheken / -Deps herunterzuladen.

Morbo
quelle
2

Der Beispielcode führt zu einem Speicherverlust in Tomcat (nach dem Aufheben der Bereitstellung der Webanwendung verbleibt der Klassenlader weiterhin im Speicher), was outofmemoryschließlich zu einem Speicherverlust führen kann . Die Lösung besteht darin, sqlite-jdbc-3.7.8.jar zu verwenden . Es ist ein Schnappschuss, daher erscheint er noch nicht für Maven.

Schnecke
quelle
0

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

sollte sein: java -cp .:sqlitejdbc-v056.jar; Test

Beachten Sie das Semikolon nach ".jar". Ich hoffe, das hilft den Menschen und kann viel Ärger verursachen

Eddie
quelle
Möchtest du das näher erläutern? On * nix the; trennt Java vom Testbefehl (und erstellt daher einen Fehler). Unter Windows funktioniert das: nicht als CP-Separator. Alles in allem .:xxx.jar;macht es also keinen Sinn. Außerdem müssen Sie den Paketnamen für die Testklasse angeben.
eckes