Когда выполнять оператор finalize в sqlite в iOS?

#iphone #ios #ipad #sqlite

#iPhone #iOS #iPad #sqlite

Вопрос:

При использовании sqlite в iOS, когда выполнять оператор finalize?

Нужно ли мне завершать инструкцию после каждого запроса?

В чем разница между reset и finalize?

Если я выполню сброс, нужно ли мне тогда выполнять finalize?

Спасибо.

Ответ №1:

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, amp;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);
  

Комментарии:

1. если в приведенном выше блоке кода у нас есть второй SQL-запрос, мы все равно вызываем finalize(statement) перед sqlite3_prepare_v2() в query2, а затем снова вызываем finalize (statement) после пошагового выполнения инструкции с query2 ? Или, если у меня есть метод, который опрашивает сервер каждые 5 секунд и сохраняет результаты в базе данных, должен ли я исключить оператор finalize внутри этого метода по соображениям производительности или это не будет считаться «повторным использованием»?