[PSP] SQLite3

Hola, navegando por ps2dev encontre la libreria sqlite3, algo que me es muy util para mi programa, pero el problema esque no consigo mostrar el resultado de la consulta sql SELECT... es decir, supuestamente se crea la base de datos, se crea la tabla, se insertan los valores, y el select se ejecuta, pero el problema esque no se como puedo mostrarlo en pantalla, es decir, que variable almacena la respuesta de la consulta.

El codigo es el siguiente:

int rc = sqlite3_open("./test.db", &db);

if( rc ){
sqlite3_close(db);
// ERROR
}
// NO HAY ERROR

rc = sqlite3_exec(db,"SELECT valor2 FROM tabla WHERE valor1=1",SQLite3_callback,0,&errmsg);

if (rc!=SQLITE_OK) {
sqlite3_free(errmsg);
// ERROR
}
// NO HAY ERROR
sqlite3_close(db);



y la funcion SQLite3_callback es esta:
static int SQLite3_callback(void *NotUsed, int argc, char **argv, char **azColName)
{
int i;
for(i=0; i {
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}



PD: Por cierto, con que programa se pueden abrir los archivos .db para ver las tablas y demas??

Saludos y gracias de antemano.
Aquí tienes la documentación:
http://www.sqlite.org/capi3.html

Según tu código, el callback tiene 2 dos dobles punteros de caracteres que deberían almacenar los datos que buscas.

static int SQLite3_callback(void *NotUsed, int argc, char **argv, char **azColName)

- azColName: El nombre de la columna
- argv: El contenido/valor de la columna


Aquí tienes programas para "administrar" la base de datos
http://www.sqlite.org/cvstrac/wiki?p=ManagementTools
Muchas gracias por tu respuesta Turulox.

Entonces, si el valor y nombre de la columna son argv y azColName, como podria ponerlos mediante un printf??

He probado a poner printf("Columna: %s - Valor: %s", azColName, argv); pero no funciona :S

PD: El SQLiteMan para ver bases de datos va de lujo, ;)

Saludos y gracias de nuevo.
Has probado a comprobar si al ejecutar el query no se produce un error?

En vez de:
if (rc!=SQLITE_OK) {
sqlite3_free(errmsg);
// ERROR
}


Usa:
if (rc != SQLITE_OK) {
     printf("Error querying database\n");
     printf("Message: %s", ermsg);
     sqlite3_free(errmsg);
}


Si no llega a escribir "Columna: %s - Valor: %s", azColName, argv" al menos una vez, es que o la consulta no devuelve resultados, o se ha producido un error.
Pues error no da porque RC = SQLITE_OK asique debe de haber hecho la consulta bien (lo he verificado con el sqliteman y efectivamente se crea la tabla, las columnas y los valores) pero al hacer el select lo hara bien tambien, pero el caso es que no recupero el resultado del select en la variable argv.

PD: Al compilar me dice: Warning: format '%s' expects type 'char *', but argument 3 has type 'char **'.

Saludos y gracias ;)
Hombre aunque hagas el checkeo del código devuelto, es como si no lo estuvieses haciendo, porque lo único que haces es liberar el puntero con el mensaje de error, pero no estas informando de si ha entrado en el "if" o no, con lo cual no te enteraras....

Respecto al warning, es normal, porque como te he dicho es un doble puntero de char, si vienes de lenguajes de programación de alto nivel, seria algo parecido a un array de strings.

Debería ser:
printf("Columna: %s - Valor: %s", azColName[x], argv[x]);


Donde x sea un int claro...

Prueba este callback a ver:
static int SQLite3_callback(void *NotUsed, int argc, char **argv, char **azColName)
{
   int i;

   printf("Numero de resultados: %i\n", argc);

   for(i=0; i<argc; i++)
      printf("Columna: %s, Valor: %s\n", azColName[i], argv[i]);

   return 0;
}
Gracias por tu respuesta,

He conseguido avanzar algo :P

Haber, el problema era eso, que el resultado se mostraba solo 1 vez, porque se ejecutaba SQLite3_Callback solo 1 vez, pero claro si lo pongo dentro de un while lo muestra todo el rato, pero no es plan de estar todo el rato haciendo la consulta y leyendo de la MS.

Y lo de poner printf("Columna: %s - Valor: %s", azColName[0], argv[0]); va bien al compilar y todo (no da problemas de %s es char y argv es char**) pero el problema es que al ejecutarlo en la PSP se queda colgada.

Lo que yo quiero hacer es exactamente eso, realizar la consulta y tener el resultado en una variable (bueno en este caso 2, nombre de la columna y valor de la columna) de modo que se almacene en un array por ejemplo result[1] = valor de la columna.

Saludos y gracias de nuevo.
Hola, fui a la página del ps2dev, pero no me aclaré como poder descargar los fuentes para echar un vistazo.
Creo que se tenía que mandar un mensaje a uno el foro, lo hice pero... nada de nada xD.
Podríais subir a Megaupload las librerias que se necesitan y ejemplos de SQLite3.
Gracias.
7 respuestas