Что вызывает создание файла журнала в SQLite?
Я начал замечать странное поведение с моими запросами SQLite для моего приложения iPhone. Всякий раз, когда я выполняю инструкцию "INSERT", файл журнала создается рядом с моим файлом БД (точное имя файла - "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 ' и остается там, пока я не закрою БД. Что мне нужно сделать, чтобы это прошло?
3 ответов
SQLite по умолчанию создает файл журнала в начале транзакции, что является хорошей вещью. Обычно он удаляет файл при фиксации.
вы можете изменить это поведение, чтобы просто усечь файл (нет необходимости создавать/удалять) или обнулить его с помощью команды Pragma sql. Не все параметры могут поддерживаться в вашей версии SQLite.
PRAGMA journal_mode = DELETE | TRUNCATE | PERSIST | MEMORY | OFF
операции записи обычно не завершаются до фиксации, которая реализуется путем усечения, удаления или аннулирование журнала.
Если это поведение является новым, у меня нет объяснения, почему оно могло измениться, кроме, возможно, обновления SQLite изменило поведение по умолчанию или стало более сложным, не открывая журнал для каждой транзакции.
Почему вы хотите?
файл журнала отслеживает каждую транзакцию в базе данных; вы хочу он будет висеть, пока вы не закроете базу данных, так что состояние БД может быть восстановлено после сбоя, даже если буферы записи не сброшены и т. д.
Как сказал Джо, журнал создается при запуске транзакции, а SQLlite создает его для вас при запуске оператора.
чтобы очистить этот журнал и убедиться, что оператор был зафиксирован для использования БД:
sqlite3_finalize(insertStmt);
прежде чем ваши близкие.
The .файл журнала исчезнет, и все ваши данные будут хорошими и безопасными в вашей БД.
надеюсь, что это помогает.
Крис.