sqlite3_exec
не подходит, если вы хотите обрабатывать возвращаемые данные в том месте, где вы его запрашиваете, и имеет некоторые другие недостатки.
Для запроса вы всегда должны использовать sqlite3_prepare_v2 , а затем вызовите sqlite3_step в цикле. Чтобы получить значения переменных в инструкции, используйте маркеры параметров (?
) и функции sqlite3_bind * . Чтобы прочитать возвращаемые значения, используйте функции sqlite3_column _ * (но в этом случае вы действительно не хотите читать какие-либо значения).
char *user = "Supu";
char *password = "secret";
sqlite3_stmt *stmt;
const char *sql = "SELECT username, password FROM user WHERE username = ? AND password = ?";
rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
if (rc != SQLITE_OK) {
fprintf(stderr, "error: %s, %s\n", sql, sqlite3_errmsg(db));
} else {
sqlite3_bind_text(stmt, 1, user, -1, SQLITE_TRANSIENT);
sqlite3_bind_text(stmt, 2, password, -1, SQLITE_TRANSIENT);
while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) {
printf("returned row: user = %s, password = %s\n",
sqlite3_column_text(stmt, 0),
sqlite3_column_text(stmt, 1));
count++;
}
if (rc != SQLITE_DONE)
fprintf(stderr, "error: %s\n", sqlite3_errmsg(db));
sqlite3_finalize(stmt);
}
В слегка предвзятом ответе вы можете посмотреть https://github.com/outworkers/phantom вместо использования стандартного драйвера java.
scala.concurrent.Future
, monix.eval.Task
или даже com.twitter.util.Future
из запроса автоматически. Вы можете выбирать между всеми тремя. ContactPoint
и Database
, в которых есть shutdown
методы, которые можно легко подключить к жизненному циклу приложения. Краткий ответ: у вас должен быть способ вызова session.close
или session.closeAsync
в течение жизненного цикла, когда вы отключаете все остальное, это как он предназначен для работы.