Что вызывает создание файла журнала в SQLite? - PullRequest
26 голосов
/ 11 марта 2009

Я начал замечать странное поведение с запросами 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 ]

24 голосов
/ 11 марта 2009

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

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

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

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

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

2 голосов
/ 11 марта 2009

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

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

sqlite3_finalize(insertStmt);   

До вашего закрытия.

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

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

Крис.

2 голосов
/ 11 марта 2009

Зачем вы хотите?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...