HowTo: Realizar consultas a una base de datos sqlite desde java.

Sqlite no es un gestor de bases de datos como MySql, Oracle o PostgreSql sino que, es una librería que permite tener una base de datos transaccional en un archivo sin necesidad de un servidor o configuración alguna lo cual puede llegar a ser muy útil para cierto tipo de proyectos que no requieran un servidor dedicado de base de datos.

Para poder utilizar este tipo de bases de datos como nuestra capa de persistencia en java todo lo que necesitamos es la librería (jar) o “driver” que puede ser descargado desde aquí.

Una vez descargada la librería de sqlite para java, podemos agregarlo a nuestro buildpath si es que estamos usando una IDE como eclipse o netbeans o agregarlo al classpath al momento de compilar la aplicación.

Para realizar la conexión únicamente necesitamos agregar las siguientes lineas:


  Class.forName("org.sqlite.JDBC");
  Connection conn = DriverManager.getConnection("jdbc:sqlite:sqliteFile");
 
  • La primera linea se encarga de cargar la clase de la librería sqlite.
  • La segunda linea crea una conexión a la base de datos auto contenida (archivo).
  • “sqliteFile” es la ruta completa del archivo (ej. /opt/base1.sqlite) que contiene o contendrá la base de datos, si el archivo no existe sera creado eh inicializado y si ya existe sera usado.

Una vez creada la conexión podemos usarla para acceder a la base de datos.


  PreparedStatement ps = null;
  ps = conn.prepareStatement("insert into tabla1 values (?);");
  ps.setInt(1,10);
  ps.execute();
  ps.close();
 

Hay que tomar en cuenta que por el carácter de este tipo de bases de datos no se puede escribir cuando se tiene un flujo de lectura abierto o leer cuando se tiene un flujo de escritura abierto, es decir, al realizar una transacción en la base de datos esta se bloquea hasta que la transacción se cierra por lo que es muy importante cerrar dicha transacción tan pronto como sea posible.
Se recomienda hacer uso de los prepared statements y de los batch y realizar todas las transacciones de una sola vez.


  PreparedStatement ps = null;
  ps = conn.prepareStatement("insert into tabla1 values (?);");
  for(int i=0; i < 20 ; i++){
    ps.setInt(1,i);
    ps.addBatch();
  }
  conn.setAutoCommit(false);
  ps.executeBatch();
  conn.commit()
  ps.close();
 

Tambien hay que recordar cerrar los ResultSet en cuanto se terminen de usar.


  PreparedStatement ps = conn.prepareStatement("SELECT * FROM tabla1");
  ResultSet rs = ps.executeQuery();
  while(rs.next()){
    System.out.println(rs.getString(1));
  }
  rs.close();
 

Para finalizar dejare el codigo de un ejemplo completo:


/** @author cool2k
* fecha 05/JUN/2009
*
* Ejemplo para crear una base de datos con la libreria sqlite y crear algunas entradas.
*
*/

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class sqlite {

private sqlite(){}

/**
*
* @param args
* @throws ClassNotFoundException
* @throws SQLException
*/
public static void main(String[] args)
throws ClassNotFoundException, SQLException{
Class.forName("org.sqlite.JDBC");
Connection conn = DriverManager.getConnection("jdbc:sqlite:/tmp/db1.sqlite");
PreparedStatement ps = null;

conn.prepareStatement("create table tabla1(id,nombre,apellido,telefono)").execute();
conn.prepareStatement("create table tabla2(id,usuario,password,email)").execute();

conn.setAutoCommit(false);

ps = conn.prepareStatement("insert into tabla1 values(?,?,?,?)");
ps.setInt(1, 1);
ps.setString(2, "Juan");
ps.setString(3, "Perez");
ps.setString(4, "55123456");
ps.addBatch();
ps.setInt(1, 2);
ps.setString(2, "José");
ps.setString(3, "Peres");
ps.setString(4, "55345612");
ps.addBatch();
ps.setInt(1, 3);
ps.setString(2, "Ana");
ps.setString(3, "Perez");
ps.setString(4, "55561234");
ps.addBatch();
ps.executeBatch();
conn.commit();
ps.close();

ps = conn.prepareStatement("insert into tabla2 values(?,?,?,?)");
ps.setInt(1, 1);
ps.setString(2, "jperez");
ps.setString(3, "mypass");
ps.setString(4, "j.perez@correo.com");
ps.addBatch();
ps.setInt(1, 2);
ps.setString(2, "joperes");
ps.setString(3, "mypass2");
ps.setString(4, "jose.peres@correo.com");
ps.addBatch();
ps.setInt(1, 3);
ps.setString(2, "aperez");
ps.setString(3, "mypass3");
ps.setString(4, "ana@correo.com");
ps.addBatch();
ps.executeBatch();
conn.commit();
ps.close();

conn.close();

}
}
 

Espero que esta entrada les sea de ayuda.
Saludos !!

14 responses to this post.

  1. Posted by yesaliab on junio 18, 2009 at 2:06 pm

    Gracias =) aclaro mis dudas la explicación
    Saludos….

    Responder

  2. Posted by K on julio 28, 2009 at 2:06 pm

    Saludos, buscando fragmentos de código para optimizar el acceso a la base. Me sirve mucho tu exlicación

    Gracias.

    Responder

  3. Posted by Mendi on noviembre 20, 2009 at 11:33 am

    Hola, hoy me dió por probar SQLite y me gustó mucho su sencillez y portabilidad, sin embargo, tengo una consulta…

    Connection conn = DriverManager.getConnection(“jdbc:sqlite:sqliteFile”)

    Estoy trabajando con NetBeans, supongamos que mi base de datos es “prueba.db” y la tengo ubicada en el directorio src de mi proyecto, es decir, el directorio en donde tengo mis packages y clases.java, como podría especificar la ruta de la bd?

    había probado con jdbc:sqlite:prueba.db pero al parecer no está conectando.

    Agradecería mucho tu respuesta

    Responder

    • Posted by cool2k on noviembre 21, 2009 at 12:38 am

      Que tal Mendi.

      Lo que necesitas es obtener el directorio en donde se esta ejecutando tu programa, probablemente lo puedas conseguir con:

      System.out.println ( new File (“.”).getCanonicalPath() );

      Esta linea debería darte la ruta completa del directorio que necesitas o al menos algo muy cercano.

      Espero que te sea de ayuda.

      Saludos !!

      Responder

  4. Posted by Jm on marzo 15, 2012 at 7:32 am

    Buenas!!

    Estoy utilizando SQLite con netbeans para mi proyecto fin de carrera y tengo un problema al menos es curioso y es el siguiente, la bd cuando ejecuto la aplicación parece funcionar perfectamente, por ejemplo al eliminar un documento o al insertar una nueva categoria se realizan sin problemas, es más, puse un boton en la misma aplicación con una consulta a las distintas tablas para comprobar que los cambios se realizan, y asi es se realizan y me aparecen los cambios como si los hiciera bien, ¿cual es el problema? que cuando cierro la aplicación esos cambios que antes con la consulta me los daba bien ahora no aparecen, es decir no se ha eliminado, no se ha guardado la creacion de la categoria por ejemplo… como puede ser que durante la ejecución si realiza los cambios consultando la bd y luego desaparecen…
    Lo unico que se aprecia al cerrar la aplicacion es al insertar nuevos documentos…

    Las sentencias están bien y no me salta ninguna excepción ni nada… en fiin me estoy volviendo loco con esto jaja

    Espero que me podais ayudar, un saludo y Gracias!!

    Responder

    • Posted by cool2k on abril 15, 2012 at 11:25 am

      Hola Jm,

      Disculpa la tardanza, podria ser un problema de rollback.. ¿has intentado hacer commit explicitamente después de actualizar o borrar? eso podria solucionar el problema.

      Saludos !!

      Responder

  5. Posted by Thororm on mayo 11, 2012 at 5:20 am

    Hola,buenas cool2k .Queria agradecerte la explicacion tan sencilla y clara que has expuesto , estoy acabando con mi proyecto de final de carrera y gracias a tus explicaciones estoi consiguiendo trabajar sin problemas con un tipo de bd nuevo para mi como lo es SQLite.He buscado mucho he mirado en la web oficial y la verdad todas las explicaciones y tutoriales me parecian incompletos o chapuceros hasta que he visto el tuyo y basicamente me ha resuelto todas las dudas que tenia.
    Muchas gracias.

    Responder

    • Posted by cool2k on mayo 13, 2012 at 3:07 pm

      Me alegra mucho escuchar que lo expresado aquí te ha sido de utilidad.

      Gracias por leer mi blog.. ( bastante abandonadon ), tus palabras me inspiran a seguir aportando granitos de arena.

      Saludos !!!

      Responder

  6. Posted by joan on marzo 9, 2013 at 3:51 pm

    Que grande eres, me has ayudado un monton, consulta que me tardaban más de un minuto ahora las hago en menos de un segundo. MUCHAS GRACIAS. Saludos crack.

    Responder

  7. Posted by Hydra on mayo 28, 2013 at 11:41 am

    Hola eso me ha ayudado muchísimo. Estoy haciendo un proyecto de carrera y tengo montada la aplicación en Java con Sqlite, todo muy bien. Ahora tengo un problema. Como trabajo con un cliente, este me dijo que quería la opción de poder cargar sus propias bases de datos. Intenté hacer una nueva conexión a la base de datos pero no la coje. no tengo idea de qué pase. Si me pudieras ayudar te lo agradecería mucho.

    Responder

    • Posted by cool2k on mayo 29, 2013 at 1:30 am

      Si la base de datos esta siendo usada no se puede realizar otra conexión hasta que se cierre la que ya esta abierta. Ese es tu caso?

      Responder

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: