Introducción
SQLite es un Sistema de Gestión de Bases de Datos (SGBD) con la particularidad de que no utiliza una arquitectura cliente-servidor, sino que la biblioteca SQLite se integra dentro del programa que la usa.
El beneficio de utilizar SQLite en tus aplicaciones Qt es la facilidad de integración y la posibilidad, si la aplicación lo requiere, de cambiar posteriormente a otro gestor con unos cambios mínimos en el código. Por ejemplo, puedes construir un prototipo de aplicación sobre SQLite para mostrarle al cliente los avances y la funcionalidad y, en el momento de desplegar la aplicación, utilizar un motor como MySql, SQL Server, PostgreSQL u Oracle.
Para pequeñas aplicaciones de escritorio se adapta a la perfección, aunque hay que cuidar algunos detalles como donde guardar el archivo de la base de datos, de forma que sea transparente al sistema operativo que utilicemos.
Empezando el proyecto
Para este artículo nos basaremos en que tienes instalada la última versión del SDK Qt para tu plataforma (puedes descargarlo desde aquí). Una vez todo instalado, la forma más facil de empezar a programar en Qt es con su IDE Qt Creator.
Abre Qt Creator y crea un nuevo proyecto que utilice el módulo SQL. Una vez creado el proyecto deberás tener un archivo main.cpp, mainwindow.cpp, mainwindow.h, mainwindow.ui y archivo .pro de tu proyecto.
Creando la conexión
Para crear la conexión desde la aplicación a sqlite utilizaremos la clase QSqlDatabase. Para bases de datos SQLite sólo es necesario establecer el nombre de la base de datos (o la ruta al archivo que es lo que nos interesa). De momento le diremos a Qt que cree una base de datos en memoria para comprobar la conexión. Podemos crear un archivo llamado por ejemplo dbConnection.h con el siguiente código que creará una base de datos con la tabla prueba y dos campos (id y campo1):
#ifndef DBCONNECTION_H
#define DBCONNECTION_H
#include
#include
#include
#include
// Crea la conexión a la BD
static bool createConnection()
{
//Instanciamos QSqlDatabase y le ponemos nombre a la base de datos
// :memory: se utilizar para crear una bd en memoria
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory:");
//Abre la base de datos y muestra un aviso en caso de error
if (!db.open()) {
QMessageBox::critical(0, qApp->tr("Error al abrir la Agenda"),
qApp->tr("Ha sido imposible abrir los contactos de la Agenda"),
QMessageBox::Ok);
return false;
}
//Crea la tabla prueba
QSqlQuery query;
query.exec("create table if not exists prueba "
"(id integer primary key autoincrement, "
"campo1 varchar(50))");
return true;
}
#endif // DBCONNECTION_H
Ahora desde el main.cpp debemos incluir el archivo que hemos creado y llamar a la función createConnection() para que establezca la conexión y cree la tabla prueba:
#include
#include "dbConnection.h"
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//Si no puede realizar la conexión finaliza el programa
if (!createConnection())
{
return 1;
}
MainWindow w;
w.show();
return a.exec();
}
Con esto ya puedes compilar y ejecutar el programa. Si no ha mostrado ningún error ni aviso es que la conexión se ha realizado de forma satisfactoria. El problema es que es poco práctico tener una base de datos que “desaparezca” cada vez que cerremos el programa…
¿Dónde y cómo almacenar el archivo de la base de datos?
Para que sea util tener una base de datos la información debe estar disponible cada vez que iniciemos el programa, para ello la solución es guardar el archivo de la base de datos en una localización lo más estándar posible. El problema que se nos plantea es que cada sistema operativo tiene una forma de almacenar la información requerida por las aplicaciones… Pero para esto Qt tiene una agradable y buena solución: la clase QDesktopServices. Esta clase nos provee de los mecanismos necesarios para acceder a los servicios más comunes de los entornos de escritorio cómo rutas a carpetas de documentos, librerías, manejadores de URLs, etc…
La idea es utilizar esta clase para que nos diga cual es la ruta por defecto (en el sistema sobre el que estemos ejecutando la aplicación) donde guardar los datos del programa. Para ello haremos unas pequeñas modifcaciones en el archivo dbConnection.h dejándolo de la siguiente forma:
#ifndef DBCONNECTION_H
#define DBCONNECTION_H
#include
#include
#include
#include
//Nuevas líneas
#include
#include
// Crea la conexión a la BD
static bool createConnection()
{
//Nuevas líneas
//Obtenemos el directorio en el que se almacenan los datos de las aplicaciones
QString dataDir = QDesktopServices::storageLocation(QDesktopServices::DataLocation);
QDir dir(dataDir);
//Creamos la ruta al fichero de la base de datos
QString dbName = dir.filePath("Aplicacion.sqlite");
//Instanciamos QSqlDatabase y utilizamos dbName como ruta
//al archivo de la base de datos
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(dbName); <--l aviso="" base="" bre="" caso="" datos="" db.open="" de="" en="" error="" if="" la="" modificada="" muestra="" nea="" qapp-="" qmessagebox::critical="" un="" y="">tr("Error al abrir la Agenda"),
qApp->tr("Ha sido imposible abrir los contactos de la Agenda"),
QMessageBox::Ok);
return false;
}
//Crea la tabla prueba
QSqlQuery query;
query.exec("create table if not exists prueba "
"(id integer primary key autoincrement, "
"campo1 varchar(50), ");
return true;
}
#endif // DBCONNECTION_H--l>
Listo y sin problemas
Ya deberías ser capaz de tener una base de datos SQLite almacenada en una ubicación destinada a datos para cada sistema operativo. Es recomendable que leas toda la documentación oficial desde el sitio de Qt utilizando los enlaces que te dejo a continuación
0 comentarios: