Подтвердить что ты не робот

Что вызывает создание файла журнала в SQLite?

Я начал замечать странное поведение с моими запросами SQLite для моего iPhone-приложения. Всякий раз, когда я выполняю инструкцию "INSERT", файл журнала создается рядом с моим файлом db (точное имя файла "userdata.db-journal" ).

Если я правильно понимаю документы, этот файл журнала используется SQLite, чтобы иметь возможность отката в случае сбоя операции. Но файл остается там после завершения операции.

Я делаю классические шаги для подготовки, привязки и выполнения запроса (для простоты нет проверок для возвращаемых значений):

sqlite3 *db = NULL;
sqlite3_open( "userdata.db", &db );

sqlite3_stmt *insertStmt = NULL;
const char *query = "INSERT INTO table VALUES(?,?)";
sqlite3_prepare_v2( db, query, -1, &insertStmt, NULL );

sqlite3_bind_int( insertStmt, 1, 0 );
sqlite3_bind_int( insertStmt, 2, 0 );

sqlite3_step( insertStmt );

sqlite3_reset( insertStmt );
sqlite3_clear_bindings( insertStmt );

sqlite3_close( db );

Файл журнала создается после вызова функции "sqlite3_step" и остается там до тех пор, пока я не закрою db. Что мне нужно сделать, чтобы оно исчезло?

4b9b3361

Ответ 1

SQLite по умолчанию создает файл журнала в начале транзакции, что хорошо. Обычно он удаляет файл при фиксации.

Вы можете изменить это поведение, чтобы просто обрезать файл (без необходимости создания/удаления) или его обнулить, используя команду PRAGMA sql. Не все опции могут поддерживаться в вашей версии SQLite.

PRAGMA journal_mode = DELETE | TRUNCATE | PERSIST | MEMORY | OFF  

Операции записи обычно не завершаются до тех пор, пока вы не выполните COMMIT, которая выполняется путем усечения, удаления или аннулирования журнала.

Если это поведение является новым, у меня нет объяснений, почему он мог измениться, кроме того, что обновление SQLite изменило поведение по умолчанию или стало более сложным, не открывая журнал для каждой транзакции.

Ответ 2

Почему вы хотите?

Файл журнала отслеживает каждую транзакцию в базе данных; вы хотите, чтобы он зависал до закрытия базы данных, чтобы состояние БД можно было восстановить после сбоя, даже если буферы записи не были сброшены и т.д.

Ответ 3

Как сказал Джо, журнал создается при запуске транзакции, и SQLlite создает его для вас при запуске оператора.

Чтобы очистить этот журнал и убедиться, что оператор был привязан к использованию db:

sqlite3_finalize(insertStmt);   

Перед закрытием.

Файл .journal исчезнет, ​​и все ваши данные будут приятными и безопасными в вашей БД.

Надеюсь, что это поможет.

Крис.