[QT]Conexion SQLITE en QT 5 (1Era Parte)

Conectar una base de datos SQLITE3 en Qt5 a veces puede ser un poco complicado pero si recordamos a las bases de programación, no es mas que un juego de niños. Pues bien comencemos:

Necesitaremos crear nuestro archivo sqlite.h que contendrá nuestra clase, contendrá esto:

1
2
3
4
5
6
7
8
9
10
11
#ifndef SQL_H
#define SQL_H
#include <QtSql>
class sql
{
public:
    sql();
    bool conectar();
    QSqlDatabase db;
};
#endif // SQL_H

Y nuestro archivo sql.cpp asi:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "sql.h"
#include 
#include 
#include 
#include 
#include 
sql::sql()
{
}
bool sql::conectar()
{
    if(QSqlDatabase::isDriverAvailable("QSQLITE")) //Verificamos que el driver QSQLITE este instalado.
    {
        db = QSqlDatabase::addDatabase("QSQLITE"); //Definimos que se usara SQLITE como driver
        db.setDatabaseName(QDir::homePath()+QDir::separator()+"data2.sqlite"); //Nuestra db en nuestro Home.
        bool db_ok = db.open(); //Creamos una bandera para ver si se puedo abrir la DB
        return db_ok;  //Retornamos true al metodo.
    }
    else
        qDebug() << "Driver no Disponible";
        return false;
}

Debemos añadir al archivo “.pro” de nuestro proyecto “sql” en el apartado:

1
QT += core gui

y dejarlo asi:

1
QT += core gui sql

De esta manera le decimos al proyeccto que usaremos las bibliotecas SQL de QT.

Con esto culminamos la conexión, en el siguiente apartado les dejare como realizar consultas a la DB a traves de QSqlQuery.

  • Juan Carlos Mayorga Montufar

    Hola F3nix!

    Una buena explicación con respecto a la conexión.

    Tengo una pregunta concreta, estoy programando en Qt para android en la 5.2

    Pero se me ha complicado agregar y abrir el archivo .sqlite al proyecto debido a que deseo utilizar paths relativos y no quemarlo en el código.

    Lo que me interesa es hallar la forma de que cuando cree el .apk se copie de manera automática con el QtCreator.

    He intentado varias opciones (sin resultado x cuestiones de paths), inclusive colocar al .sqlite en los resources (.qrc) pero tampoco se como llamarlo dentro del .cpp

    Aparte de consultar en la documentación no he logrado encontrar la solución para poder conectarme a la base de datos a través de un path relativo.

    Tienes alguna idea al respecto?

    • Victor Villalobos

      Buenas amigo comienzo por partes, primeramente no se puede insertar una DB Sqlite en un QRC, yo mismo lo intente antes y encontré que da un error debido al driver de acceso que provee qt por algun error al localizar el path.

      Por otro lado solo necesitas crear tu DB en el mismo directorio de trabajo y en el momento en el que vallas a conectar tu base de datos hacer esto:

      db.setDatabaseName(qApp->applicationDirPath() + QDir::separator()+”data2.sqlite”);

      Explico por partes:
      qApp->applicationDirpath() // Es el directorio de trabajo desde donde se ejecutara tu aplicacion.

      QDir::separator // Esto añade una barra “/” luego del path.

      y por ultimo el nombre de tu DB, te quedaría el path completo desde donde ejecutas tu app mas el nombre de la DB. Con esto debería bastar ya que por lo menos en aplicaciones desktop, todos los archivos de la raiz de tu codigo siempre se añaden al DEBUG compilado del proyecto.

      PD: No he programado para android con QT, pero estoy descargando el SDK para probar el código que te acabo de dar, aunque no creo que tenga problemas, si me encuentro con algo te lo posteo, puedes ir probando este codigo.

      Un Saludo y gracias por visitar mi humilde blog.

      • Juan Carlos Mayorga Montufar

        Hola Victor,

        gracias por tu pronta respuesta,

        En efecto, para apps de escritorio no hay problema, probe también el código nuevamente y no, tengo el mismo problema.
        “W/Qt (21007): kernel/qsqlquery.cpp:368 (bool QSqlQuery::exec(const QString&)): QSqlQuery::exec: database not open”

        Muy posiblemente este haciendo algo erróneo, de todas maneras voy a seguir haciendo el prueba/error hasta ver la forma de realizarlo.

        Me comentas que tal te va con las pruebas que vas a realizar!

        Gracias por el interés nuevamente!

        • Victor Villalobos

          Bueno estoy todavía en adaptar el QtCreator a Android usando esto http://qt-project.org/wiki/Qt5ForAndroidBuilding, la verdad me ha dado varios problemas, no hay alguna build del qt preconfigurada para android? o obligatoriamente tengo que compilar qt para arm?. Pregunto por tiempo, aunque deje clonando el git de Qt5 .

          • Juan Carlos Mayorga Montufar

            Hola Victor!

            Emmm preferible descargate los paquetes preconfigurados de aca:

            http://qt-project.org/downloads

            Con respecto a la pregunta que te hice, encontré la solución en este link!

            http://goo.gl/HLZqXr

            Era necesario configurar al proyecto dandole el path de la DB, adicional realizando los pasos explicados se conecta y puedes transaccionar sin problema tanto en el emulador como en un dispositivo android!

          • Victor Villalobos

            A ok que bueno que lo conseguistes, de todas formas compile qt5 para arm, y ya lo probe funciona bien no encontraba los paquetes preconfigurados, mas tarde me dispongo a trastear un rato.

            Saludos y suerte.

  • Pingback: [QT]Conexion SQLITE en QT 5 (2da Parte) | Código Libre