Я пытался использовать учебник по SQLite здесь , чтобы узнать, как использовать SQLite в C. У меня были проблемы с выяснением, как именно его использовать, поскольку в нем упоминается только sqlite3_exec
, которыйкажется невероятно не интуитивным, чтобы использовать для базовых запросов (он использует обратный вызов для всего).Затем я наткнулся на этот ответ https://stackoverflow.com/a/31168999/11954200,, который решает ту же проблему и предлагает использовать различные четыре оператора sqlite, которые по существу объединены в сокращенную форму sqlite3_exec
.Вот мое понимание до сих пор:
// Query to get the rows
// Part1 -- Prepare the query: cursor.execute()
// http://www.sqlite.org/c3ref/prepare.html
sqlite3_stmt *stmt; // this is the prepared statement that the sqlite3_prepare writes to
rc = sqlite3_prepare(db, "SELECT * FROM mytable LIMIT 20", -1, &stmt, NULL);
if (rc != SQLITE_OK) {
printf("error: %s", sqlite3_errmsg(db));
return 0;
}
// Part2 -- equivalent of cursor.fetchone()
// http://www.sqlite.org/c3ref/step.html
int rownum=1;
while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) {
// Part3 -- reference the values from the row
// http://www.sqlite.org/c3ref/column_blob.html
int id = sqlite3_column_int(stmt, 0);
const unsigned char * date = sqlite3_column_text(stmt, 1);
printf("Row: %d | ID: %d | Date: %s\n", rownum, id, date);
rownum++;
}
// Part4 -- equivalent of cursor.close()
// http://www.sqlite.org/c3ref/finalize.html
sqlite3_finalize(stmt);
Другими словами, на более высоком языке:
sqlite3_prepare(...)
работает как cursor.execute(...)
sqlite3_step(...)
работает как cursor.fetchone(...)
sqlite3_finalize(...)
работает как cursor.close(...)
;
Является ли это точной оценкой того, как эти операторы работают в sqlite?Будет ли sqlite3_exec
когда-либо использоваться при получении результатов?