Вы используете функцию sqlite3_finalize()
, когда закончите с оператором, либо потому, что выполнили одноразовый запрос, подобный следующему:
const char *sql = "SELECT COUNT(*) FROM bonds WHERE molecule=? AND structure=?";
sqlite3_stmt *bondCountingStatement;
unsigned int totalBondCount = 0;
if (sqlite3_prepare_v2(database, sql, -1, &bondCountingStatement, NULL) == SQLITE_OK)
{
sqlite3_bind_int(bondCountingStatement, 1, databaseKey);
sqlite3_bind_int(bondCountingStatement, 2, numberOfStructureBeingDisplayed);
if (sqlite3_step(bondCountingStatement) == SQLITE_ROW)
{
totalBondCount = sqlite3_column_int(bondCountingStatement, 0);
}
else
{
}
}
sqlite3_finalize(bondCountingStatement);
или если вы закончили с подготовленным заявлением, которое вам больше никогда не понадобится (возможно, из-за того, что вы вычищаете выход из приложения).
Если вы создали оператор, который вы хотите использовать снова и снова (из соображений производительности, поскольку подготовка оператора достаточно дорогая), вы используете sqlite3_reset()
для сброса запроса, чтобы он был готов к использованию снова. Вы не хотите завершать в этом случае, пока не решите, что никогда не захотите повторно использовать это утверждение (опять же, обычно это происходит во время демонтажа вашего приложения или определенного объекта).
Пример запроса, который сбрасывает только оператор в конце, выглядит следующим образом:
sqlite3_bind_text(insertMoleculeSQLStatement, 1, [filename UTF8String], -1, SQLITE_TRANSIENT);
int success = sqlite3_step(insertMoleculeSQLStatement);
// Because we want to reuse the statement, we reset it instead of finalizing it.
sqlite3_reset(insertMoleculeSQLStatement);