Java e SQLite [fechado]

333

Sinto-me atraído pela limpeza que um único banco de dados de arquivo fornece. Qual biblioteca de drivers / conectores existe para conectar e usar o SQLite com Java.

Eu descobri uma biblioteca de invólucros, http://www.ch-werner.de/javasqlite , mas existem outros projetos mais importantes disponíveis?

Scott Bennett-McLeish
fonte
10
Eu amo que uma pergunta com centenas de votos positivos e respostas com centenas de votos positivos seja encerrada como "fora de tópico". É uma espécie de embaraçoso, lol
Andrew Koster

Respostas:

196

O wiki lista mais alguns wrappers:

Peter Hoffmann
fonte
7
Minha adição a esta lista é sqlite4java - code.google.com/p/sqlite4java - é um invólucro (sem JDBC); pré-compilado para Windows, Mac, Linux. É simples de usar e aplica alguns contratos para ajudar o desenvolvedor a evitar o mau uso do SQLite.
sereda
7
sqlite4java parece interessante, mas eles também têm uma grande comparação dos vários invólucros fora lá: code.google.com/p/sqlite4java/wiki/ComparisonToOtherWrappers
Scott Bennett-McLeish
1
@kdt o problema que eu encontrei com o motorista zentus é que ele não parece apoiar BLOB de em tudo
Martijn
12
@Martijn xerial.org/trac/Xerial/wiki/SQLiteJDBC é uma bifurcação do driver do zentus e suporta BLOB (há um pequeno tutorial em seu site).
precisa saber é o seguinte
17
zentus.com/sqlitejdbc -> 404
m0skit0
247

Encontrei sua pergunta ao procurar informações com SQLite e Java. Apenas pensei em adicionar minha resposta, que também postei no meu blog .

Eu tenho codificado em Java por um tempo agora. Eu também conhecia o SQLite, mas nunca o usei ... Bem, eu o usei em outros aplicativos, mas nunca em um aplicativo que eu codifiquei. Então, eu precisava dele para um projeto esta semana e é de uso tão simples!

Encontrei um driver Java JDBC para SQLite. Basta adicionar o arquivo JAR ao seu caminho de classe e importar java.sql. *

Seu aplicativo de teste criará um arquivo de banco de dados, enviará alguns comandos SQL para criar uma tabela, armazenará alguns dados na tabela e os lerá novamente e será exibido no console. Ele criará o arquivo test.db no diretório raiz do projeto. Você pode executar este exemplo com 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
fonte
1
É por isso que eu acho que Joel estava falando besteira (google tech talk: youtube.com/watch?v=NWHfY_lvKIQ ) ao dizer que o design do stackoverflow.com é melhor por causa de todas as postagens "antigas" na Internet. É apenas uma repetição.
Nikolaos
26
Observe também que o projeto Crawshaw parece em hiato, mas foi bifurcada e atualizado aqui: xerial.org/trac/Xerial/wiki/SQLiteJDBC
Lapo
8
zentus.com parece quebrado, encontrou um espelho aqui; priede.bf.lu.lv/pub/DatuBazes/SQLite/SqliteJDBC/about.htm
Daniel Magnusson
3
Obrigado @DanielMagnusson, você salva a vida. Enquanto estiver no tópico, qualquer um que ainda estiver procurando pelo driver sqliteJDBC pode acessar priede.bf.lu.lv/pub/DatuBazes/SQLite/SqliteJDBC/…, pois o link ao about.htm está incorreto.
javatarz
2
dependência maven: mvnrepository.com/artifact/org.xerial/sqlite-jdbc
Carl Bosch
30

Entendo que você perguntou especificamente sobre SQLite, mas talvez o banco de dados HSQL seja mais adequado ao Java. Ele é escrito no próprio Java, é executado na JVM, suporta tabelas na memória etc., e todos esses recursos o tornam bastante utilizável para prototipagem e teste de unidade.

javashlook
fonte
3
Sim, o HSQL é uma escolha muito boa e eu o usei bastante em alguns aplicativos clientes para obter um bom efeito. Nesse caso, no entanto, eu realmente queria usar o SQLite.
Scott Bennett-McLeish
18

O projeto David Crawshaw (sqlitejdbc-v056.jar) parece desatualizado e a última atualização foi em 20 de junho de 2009, fonte aqui

Eu recomendaria Xerials fork de invólucro de sqlite Crawshaw. Substituí o sqlitejdbc-v056.jar pelo arquivo Xerials sqlite-jdbc-3.7.2.jar sem nenhum problema.

Usa a mesma sintaxe da resposta de Bernie e é muito mais rápida e com a mais recente biblioteca sqlite.

O que é diferente do SQLite JDBC do Zentus?

O driver SQLite JDBC original do Zentus, http://www.zentus.com/sqlitejdbc/ , é um excelente utilitário para o uso de bancos de dados SQLite da linguagem Java, e nossa biblioteca SQLiteJDBC também conta com sua implementação. No entanto, sua versão em java puro, que traduz totalmente os códigos c / c ++ do SQLite em Java, é significativamente mais lenta em comparação à sua versão nativa, que usa binários SQLite compilados para cada sistema operacional (win, mac, linux).

Para usar a versão nativa do sqlite-jdbc, o usuário teve que definir um caminho para os códigos nativos (dll, jnilib, so files, que são programas JNDI C) usando argumentos de linha de comando, por exemplo, -Djava.library.path = (caminho para a dll, jnilib etc.) ou -Dorg.sqlite.lib.path etc. Esse processo foi propenso a erros e incômodo dizer a todos os usuários para definir essas variáveis. Nossa biblioteca SQLiteJDBC elimina completamente esses inconvenientes.

Outra diferença é que estamos mantendo esta biblioteca de bibliotecas SQLiteJDBC atualizada para a versão mais recente do mecanismo SQLite, porque somos um dos usuários mais populares desta biblioteca. Por exemplo, o SQLite JDBC é um componente principal do UTGB (University of Tokyo Genome Browser) Toolkit, que é nosso utilitário para criar navegadores de genoma personalizados.

EDIT : Como sempre, quando você atualiza algo, haverá problemas em algum lugar obscuro do seu código (aconteceu comigo). Teste teste teste =)

Daniel Magnusson
fonte
1
O sqlite-jdbcprojeto é excelente, mas saiba que é licenciado pela Apache . Portanto, você deve atribuir a atribuição, se o usar, seja seu código FOSS ou proprietário.
dotancohen
16

Há um novo projeto SQLJet que é uma implementação Java pura do SQLite. Ainda não suporta todos os recursos do SQLite, mas pode ser uma opção muito boa para alguns dos projetos Java que funcionam com bancos de dados SQLite.


fonte
4
Parece promissor, mas parece que ainda não oferece uma capacidade de consulta SQL, uma espécie de quebra de negócio para mim.
22330 Scott Bennett-McLeish
Ainda não suporta consultas SQL, mas uma API de nível inferior.
Basel Shishani
Ainda é muito útil para aplicativos em que você só precisa gerar arquivos SQLite, ou seja, não precisa do SQL para consultar os dados.
O Alquimista
5

A publicação de Bernie é muito útil. Não foi possível votar (não tem reputação suficiente :(). Mas ajudou muito. Só para reiterar!

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

Aqui você encontra o mais recente jar SQLite JDBC. Basta adicionar o jar no seu caminho de classe e pronto! :) Você pode executar o código de exemplo de Bernie para testar se está tudo bem.

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

Aqui você pode encontrar ajuda sobre a sintaxe SQL para SQLite. Saúde para SQLite :)

Srinivas
fonte
3

Ao compilar e executar o código, você deve definir o valor das opções do caminho de classe. Assim como o seguinte:

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

java -classpath .;sqlitejdbc-v056.jar Text

Por favor, preste atenção em "." e o sparate ";" (vitória, o linux é ":")

aboutstudy
fonte
3

O código do sqlitejdbc pode ser baixado usando o git em https://github.com/crawshaw/sqlitejdbc .

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

Nota: Makefile requer curl binary para baixar bibliotecas / deps sqlite.

Morbo
fonte
2

O código de exemplo leva a um vazamento de memória no Tomcat (depois de desimplementar o aplicativo da web, o carregador de classes ainda permanece na memória), o que causará outofmemoryeventualmente. A maneira de resolver isso é usando o sqlite-jdbc-3.7.8.jar ; é um instantâneo, por isso ainda não aparece para o maven.

Caracol
fonte
0

Erro de digitação: java -cp .:sqlitejdbc-v056.jar Test

deveria estar: java -cp .:sqlitejdbc-v056.jar; Test

observe o ponto-e-vírgula após ".jar", espero que ajude as pessoas, possa causar muitos problemas

Eddie
fonte
Cuidado ao elaborar? Em * nix o; separará o java do comando Test (e, portanto, criará um erro). No Windows, o: não funcionará como um separador cp. Então, apesar de tudo .:xxx.jar;, não faz sentido. E você também precisa especificar o nome do pacote para a classe Test.
Eckes