それはSQLiteのDBは、iOS版/ iPhoneで正しく閉じられていない場合は、データを失うことは可能ですか?sqlite DBが閉じていないとデータを失う可能性はありますか?
私はapplicationWillTerminate
でDBを閉じることを考えて、これは最初の任意の厄介な副作用を持っていないことを確認したいました。ほとんどの部分について
それはSQLiteのDBは、iOS版/ iPhoneで正しく閉じられていない場合は、データを失うことは可能ですか?sqlite DBが閉じていないとデータを失う可能性はありますか?
私はapplicationWillTerminate
でDBを閉じることを考えて、これは最初の任意の厄介な副作用を持っていないことを確認したいました。ほとんどの部分について
、なし。 sqlite3は、すべてを "disk"に書き込みます(そしてfflush/fsync/etcを必要に応じて呼び出します)。
大きな例外が1つあります。データベースを閉じるときにコミットされていないトランザクションがある場合は、次に開くときにロールバックされます。
正確にはPRAGMA journal_modeに依存します:「メモリ」または「オフ」の場合、書き込み中にアプリがクラッシュした場合、データベースが破損する可能性があります。私はPRAGMA locking_modeだけではないトランザクションの整合性、ロックが解除されたときに何が起こるかに影響すると思います。 -applicationWillTerminate
注:とにかく十分ではありません! UIApplicationExitsOnSuspendを設定していない場合、iOS 4のデフォルトの動作と新しいデバイス(iPhone 3G/iPod 2gより新しい)は、-applicationWillEnterBackgroundを送信してアプリを一時停止します(明らかにSIGSTOPを使用)。後でOSがあなたのアプリを終了する必要があると判断した場合は、アプリにCPU時間を与えずにSIGKILLを送信します。あなたは-applicationWillTerminate:
と-applicationWillEnterBackground:
の両方で状態を保存する必要があります。主な違いは、後者でバックグラウンドタスクを開始できることです。
(別の違いは、アプリケーションの終了時にメモリを解放しても、バックグラウンドに移動したときに発生しない、アプリケーションのWillTerminateで「クリーンアップ」が行われることです) CPU時間の浪費)