Можно ли потерять данные, если БД sqlite не закрыта? - PullRequest
2 голосов
/ 21 ноября 2010

Можно ли потерять данные, если БД SQLite не закрыта должным образом в iOS / iPhone?

Я думал о закрытии БД в applicationWillTerminate, но сначала хочу убедиться, что у него нет никаких неприятных побочных эффектов.

1 Ответ

3 голосов
/ 21 ноября 2010

По большей части, нет; sqlite3 записывает все на «диск» (и при необходимости вызывает fflush / fsync / etc) перед возвратом.

Есть одно большое исключение: если при закрытии базы данных происходит незафиксированная транзакция, она будет отменена при следующем открытии.

Что именно происходит, зависит от PRAGMA journal_mode : если это «память» или «выкл», база данных может быть повреждена, если ваше приложение аварийно завершает работу во время записи. Я думаю PRAGMA lock_mode влияет только на то, что происходит, когда снимаются блокировки, а не на целостность транзакции.

Обратите внимание, что -applicationWillTerminate: в любом случае недостаточно! Если вы не установили UIApplicationExitsOnSuspend, поведение по умолчанию на iOS 4 и достаточно новом устройстве (т. Е. Более новом, чем iPhone 3G / iPod 2g) отправить -applicationWillEnterBackground: и затем приостановить ваше приложение (очевидно, с помощью SIGSTOP). Если позднее ОС решит, что вашему приложению нужно выйти, она отправит SIGKILL, не давая вашему приложению больше ресурсов процессора. Вам нужно сохранить состояние в и -applicationWillTerminate: и -applicationWillEnterBackground:; главное отличие в том, что в последнем вы можете запустить фоновое задание.

(Другое отличие состоит в том, что вы можете выполнить некоторую «очистку» в -applicationWillTerminate: это не должно происходить, когда вы просто переходите в фоновый режим, даже если освобождение памяти, когда ваше приложение готовится к выходу, в значительной степени является пустой тратой. процессорного времени.)

...