Прежде всего, я хотел бы отметить, что приведенный ниже код может быть не окончательным кодом, который вы искали, но он может помочь вам понять, как работает функция обратного вызова.
Если функция обратного вызова 3-го аргумента для sqlite3_exec()
не равна NULL, то она вызывается для каждой строки результата, выходящей из вычисленных операторов SQL.Вы можете передать дополнительный аргумент функции callback
, здесь у вас будет возможность сохранить данные из таблицы в вашу так называемую структуру Usuario
.Четвертый аргумент callback
служит для этой цели.
В демонстрационных целях приведенный ниже код выполняет следующие действия:
- Открывает базу данных
- Создает таблицу с тремя столбцами, включая поля ID, NAME и PASSWORD
- Вставляет строку в таблицу (ID = 1, NAME = PETER, PASSWORD = ORANGE)
- Выделяет пространство для структуры
- Выполняет оператор выбора и ВЫЗЫВАЕТCALLBACK () функция, которая хранит данные.
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
#include <string.h>
typedef struct Usuario{
char *name;
char *password;
} Usuario;
int callback(void *Usuario, int argc, char **argv, char **azColName) {
struct Usuario *tmp = (struct Usuario *)Usuario;
char missing[] = "MISSING";
tmp->name = (char *)malloc(sizeof(char) * strlen(argv[1]));
tmp->name = argv[1] ? argv[1] : (char*)"NULL";
tmp->password = (char *)malloc(sizeof(char) * strlen(argv[2]));
tmp->password = argv[2] ? argv[2] : (char*)"NULL";
return 0;
}
void bd_sacarDatosUsuario() {
sqlite3 *db;
char *zErrMsg = 0;
int rc;
// Open database
rc = sqlite3_open("test.db", &db);
if( rc ) {
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
return ;
} else {
fprintf(stderr, "Opened database successfully\n");
}
/* Create table statement */
const char *sql = "CREATE TABLE TEST(" \
"ID INT PRIMARY KEY NOT NULL," \
"NAME CHAR(50) NOT NULL," \
"PASSWORD CHAR(50) NOT NULL);";
rc = sqlite3_exec(db, sql, NULL, 0, &zErrMsg);
if( rc != SQLITE_OK ){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Success\n");
}
// Insert test data
sql = "INSERT INTO TEST(ID, NAME, PASSWORD) VALUES(1, \"PETER\", \"ORANGE\");";
rc = sqlite3_exec(db, sql, NULL, 0, &zErrMsg);
if( rc != SQLITE_OK ){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Success\n");
}
// Allocate space for the structure
struct Usuario *u = (struct Usuario *)malloc(sizeof(struct Usuario));
sql = "SELECT * FROM TEST";
rc = sqlite3_exec(db, sql, callback, u, &zErrMsg);
if( rc != SQLITE_OK ){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Success\n");
}
sqlite3_close(db);
printf("Hi my name is: %s with password of %s\n", u->name, u->password);
}
int main() {
bd_sacarDatosUsuario();
}
Измените структуру в соответствии с вашими потребностями.Обратите внимание, что вы должны проверить, возвращает ли malloc значение, отличное от NULL, и, конечно, освободить его после того, как вам это не нужно.