Sqlite3 instalación.
Para la parte de bases de datos del proyecto usaremos la librería sqlite3, que os tendréis que instalar. Yo lo hice mediante el gestor de paquetes synaptic.
Utilizando sqlite3.
Ahora pongo unos ejemplos de como realizar las operaciones básicas de las bases de datos mediante instrucciones de sqlite3:
Crear/Conectar una base de datos.
La función sqlite3_open (en la versión que vamos a utilizar) recibe dos parámetros: el nombre de la base de datos a abrir y un objeto tipo sqlite3*. En el caso de que la base de datos no exista la función open la creará y establecerá la conexión.
Para la detección de errores utilizaremos sqlite3_errcode que se encarga de recuperar el ultimo error producido en la base de datos, si el número devuelto no es 0 entonces ha habido un error, y para enviar un mensaje con el error producido usaremos sqlite3_errmsg que extrae el mensaje de error producido por la ultima operación realizada sobre la base de datos. Estas dos funciones reciben como parámetro el objeto sqlite3*.
Cuando se termine de usar la base de datos usaremos sqlite3_close que recibe la variable de tipo sqlite3* en la que se creó la conexión.
#include <cstdio> #include "sqlite3.h" using namespace std; //para printf en _c_stdio, esto es c++ int main(int argc, char* argv[]) { //Creamos una variable sqlite3* db; //Establecemos la conexión sqlite3_open("basepruebas.db",&db); //Comprobamos errores if (sqlite3_errcode(db)!=0){ printf("%s\n",sqlite3_errmsg(db)); } //Cerramos la conexión sqlite3_close(db); return 0; };
Crear una tabla.
Recordad que siempre que se vaya a usar una la base de datos se tendrá que establecer la conexión con ella y cuando se termine cerrarla como se ha explicado antes.
Para ejecutar cualquier sentencia sql se usará sqlite3_exec que recibe 5 parámetros:
1. Conexión con la base de datos(variable sqlite*).
2. Sentencia o sentencias sql que queremos ejecutar. Yo recomiendo usa solo una sentencia en cada llamada ya que eso facilitara la lectura del código y nos resultará mas fácil.
3. Función que se encargará de tratar los resultados de la sentencia sql del argumento 2. Esta función la definiremos nosotros y debe recibir:
- Puntero void*
- Entero que indica el numero de columnas en el resultado.
- Array de strings (en el ejemplo char**) que contiene los valores de cada columna.
- Array de strings que contiene los nombres de la columnas.
Además esta función deber devolver 0 si no ha habido errores.
4. Puntero que se le pasa a la función del argumento 2 como primer parámetro.
5. Array de strings que guardara el error producido en caso de que se produzca. Nosotros , por ahora pondremos esto a NULL ya que la detección de errores la haremos como se ha explicado antes.
#include <cstdio> #include "sqlite3.h" using namespace std; //para printf en _c_stdio, esto es c++ int main(int argc, char* argv[]) { //creamos una variable del tipo de bases de datos. sqlite3* db; //establecemos conexión sqlite3_open("basepruebas.db",&db); //comprobamos errores if (sqlite3_errcode(db)!=0){ printf("%s\n",sqlite3_errmsg(db)); } else{ sqlite3_exec(db,"create table hdlorean(dni integer not null," "nombre varchar(30) default ' ' not null,equipo varchar(30) default ' ' not null," //como esta sentencia no generara resultados el tercer argumento lo ponemos a null. "primary key (dni));",NULL,NULL,NULL); //comprobamos errores. if (sqlite3_errcode(db)!=0){ printf("%s\n",sqlite3_errmsg(db)); } } //cerramos conexión sqlite3_close(db); return 0; };
Insertar datos
Como en el caso anterior, la sentencia sql no devuelve un resultado por lo que el tercer parámetro de sqlite3_exec sigue siendo NULL.
#include <cstdio> #include "sqlite3.h" using namespace std; //para printf en _c_stdio, esto es c++ int main(int argc, char* argv[]) { //creamos una variable del tipo de bases de datos. sqlite3* db; //establecemos conexión sqlite3_open("basepruebas.db",&db); //comprobamos errores if (sqlite3_errcode(db)!=0){ printf("%s\n",sqlite3_errmsg(db)); } else{ sqlite3_exec(db,"insert into hdlorean values (1,'XX','db');",NULL,NULL,NULL); //comprobamos errores. if (sqlite3_errcode(db)!=0){ printf("%s\n",sqlite3_errmsg(db)); } else{ sqlite3_exec(db,"insert into hdlorean values (2,XX','db);",NULL,NULL,NULL); //comprobamos errores. if (sqlite3_errcode(db)!=0){ //falta una ' en la sentencia sql! printf("%s\n",sqlite3_errmsg(db)); } } } //cerramos conexión sqlite3_close(db); return 0; };
Actualizar/Eliminar datos.
Exactamente igual para actualizar datos.
#include <cstdio> #include "sqlite3.h" using namespace std; //para printf en _c_stdio, esto es c++ int main(int argc, char* argv[]) { //creamos una variable del tipo de bases de datos. sqlite3* db; //establecemos conexión sqlite3_open("basepruebas.db",&db); //comprobamos errores if (sqlite3_errcode(db)!=0){ printf("%s\n",sqlite3_errmsg(db)); } else{ sqlite3_exec(db,"update hdlorean set nombre='Josue' where dni=1;",NULL,NULL,NULL); //comprobamos errores. if (sqlite3_errcode(db)!=0){ printf("%s\n",sqlite3_errmsg(db)); } else{ sqlite3_exec(db,"delete from hdlorean where nombre='Josue';",NULL,NULL,NULL); if (sqlite3_errcode(db)!=0){ printf("%s\n",sqlite3_errmsg(db)); } } } //cerramos conexión sqlite3_close(db); return 0; };
Ejecutar una select.
Como tras ejecutar estos ejemplos la base de datos se no has quedado vacía vamos a insertar varias filas para realizar varias selects y ver como funciona sqlite3_exec.
#include <cstdio> #include "sqlite3.h" using namespace std; //para printf en _c_stdio, esto es c++ int imprime_resultado(void* paque,int n, char** re,char** nomcol){ //El primer argumento de esta funcion es el 4 de la exec //n es el numero de filas devueltas por la query //re el contenido de la fila //nomcol el nombre de la columna printf("El %s del componente es: %s\n",nomcol[0],re[0]); return 0; } int imprime_resultado2(void* paque,int n, char** re,char** nomcol){ printf("El DNI y el nombre del componente: %s, %s\n",re[0],re[1]); return 0; } int main(int argc, char* argv[]) { //creamos una variable del tipo de bases de datos. sqlite3* db; //establecemos conexión sqlite3_open("basepruebas.db",&db); //comprobamos errores if (sqlite3_errcode(db)!=0){ printf("%s\n",sqlite3_errmsg(db)); } else{ //introducimos varias filas sqlite3_exec(db,"insert into hdlorean values (1,'XX','db');",NULL,NULL,NULL); //comprobamos errores. if (sqlite3_errcode(db)!=0){ printf("%s\n",sqlite3_errmsg(db)); } sqlite3_exec(db,"insert into hdlorean values (2,'ZZ','db');",NULL,NULL,NULL); if (sqlite3_errcode(db)!=0){ printf("%s\n",sqlite3_errmsg(db)); } sqlite3_exec(db,"insert into hdlorean values (3,'YY','core');",NULL,NULL,NULL); if (sqlite3_errcode(db)!=0){ printf("%s\n",sqlite3_errmsg(db)); } sqlite3_exec(db,"insert into hdlorean values (4,'WW','core');",NULL,NULL,NULL); if (sqlite3_errcode(db)!=0){ printf("%s\n",sqlite3_errmsg(db)); } //realizamos una select que solo devolvera un resultado. sqlite3_exec(db,"select nombre from hdlorean where dni=1;",imprime_resultado,NULL,NULL); if (sqlite3_errcode(db)!=0){ printf("%s\n",sqlite3_errmsg(db)); } //realizamos una select que devolvera varios resultados. sqlite3_exec(db,"select nombre from hdlorean where equipo='core';",imprime_resultado,NULL,NULL); if (sqlite3_errcode(db)!=0){ printf("%s\n",sqlite3_errmsg(db)); } //realizamos una select que devuelve varias columnas y varios resultados sqlite3_exec(db,"select dni,nombre from hdlorean where equipo='db';",imprime_resultado2,NULL,NULL); if (sqlite3_errcode(db)!=0){ printf("%s\n",sqlite3_errmsg(db)); } } //cerramos conexión sqlite3_close(db); return 0; };
Como podéis ver la función del tercer argumento de sqlite3_exec (cuanado la sentencia sql es una select) se repite una vez por cada fila devuelta por la sentecia.
Comentarios:
Instalación: Si alguien quiere explicar esto mejor que lo haga :P Yo no tengo mucha idea de como hacerlo exactamente.
Por ahora terminado.