Для получения данных применяется SQL-команда SELECT
. Для получения данных в функцию sqlite3_exec() в качестве третьего параметра передается указатель на функцию обратного вызова,
которая имеет следующее определение:
int (*callback)(void*,int,char**,char**)
Первый параметр этой функции - указатель void *
. По сути это может быть указатель на любой объект. Для него значение передается через четверый параметр функции
sqlite3_exec(). Благодаря этому при обращении к базе данных мы можем передать в коллбек некоторые данные.
Второй параметр функции callback представляет количество столбцов в результате.
Третий параметр функции callback представляет массив указателей на строки, где каждая строка хранит значение отдельного столбца. Если в базе данных в соответствующем столбце NULL, тогда
указатель равен NULL
.
Четвертый параметр функции callback представляет массив указателей на строки, где каждая строка хранит название столбца.
Результатом функции callback является числовой статусный код выполнения (0 при успешном выполнении).
Функция callback выполняется для каждой строки из полученного набора из базы данных.
Например, получим все ранее добавленные данные из таблицы people:
#include <stdio.h> #include <sqlite3.h> int callback(void*, int, char**, char**); int main() { sqlite3 *db; // указатель на базу данных char *err_msg = 0; int rc = sqlite3_open("test.db", &db); if (rc != SQLITE_OK) { sqlite3_close(db); return 1; } // получаем все данные из таблицы people char *sql = "SELECT * FROM people"; rc = sqlite3_exec(db, sql, callback, 0, &err_msg); if (rc != SQLITE_OK ) { printf("SQL error: %s\n", err_msg); sqlite3_free(err_msg); sqlite3_close(db); return 1; } sqlite3_close(db); return 0; } int callback(void *notUsed, int colCount, char **columns, char **colNames) { for (int i = 0; i < colCount; i++) { printf("%s = %s\n", colNames[i], columns[i] ? columns[i] : "NULL"); } printf("\n"); return 0; }
Для получения всех данных из таблицы применяется sql-команда "SELECT * FROM people"
. Основная работа производится в функции обратного вызова callback. В ней проходим
по всем столбцам и выводим на консоль их содержимое. Если столбец равен указателю NULL
, то на консоль выводим "NULL".
Первый параметр в данном случае нам не нужен, поэтому он никак не используется.
В итоге при выполнении этой программы получим консольный вывод типа следующего:
id = 1 name = Tom age = 38 id = 2 name = Bob age = 42 id = 3 name = Sam age = 28 id = 4 name = Alice age = 33 id = 5 name = Kate age = 25
Подобным образом можно выполнять другие запросы на выборку. Например, получим тех пользователей, у которых возраст больше 28, выбрав только два столбца:
char *sql = "SELECT name, age FROM people WHERE age > 28"; rc = sqlite3_exec(db, sql, callback, 0, &err_msg);
Консольный вывод:
name = Tom age = 38 name = Bob age = 42 name = Alice age = 33