2

iOS /iPhoneでSQLiteDBが適切に閉じられていない場合、データが失われる可能性はありますか?

DBを閉じることを考えていましapplicationWillTerminateたが、最初にこれに厄介な副作用がないことを確認したいと思います。

4

1 に答える 1

3

ほとんどの場合、いいえ。sqlite3 は、戻る前にすべてを「ディスク」に書き込みます (必要に応じて fflush/fsync/etc を呼び出します)。

大きな例外が 1 つあります。データベースを閉じるときにコミットされていないトランザクションがある場合、次にデータベースを開くときにロールバックされます。

何が起こるかは、PRAGMA journal_modeによって異なります。「メモリ」または「オフ」の場合、書き込み中にアプリがクラッシュすると、データベースが破損する可能性があります。PRAGMA locked_modeは、トランザクションの整合性ではなく、ロックが解放されたときに何が起こるかにのみ影響すると思います。

とにかく -applicationWillTerminate: では十分ではないことに注意してください! UIApplicationExitsOnSuspend を設定していない場合、iOS 4 および十分に新しいデバイス (つまり、iPhone 3G/iPod 2g よりも新しい) でのデフォルトの動作は、-applicationWillEnterBackground: を送信し、アプリを一時停止します (明らかに SIGSTOP を使用)。後で OS がアプリを終了する必要があると判断した場合、アプリに CPU 時間を与えることなく SIGKILL を送信します。と の両方 で状態を保存する必要が-applicationWillTerminate:あり-applicationWillEnterBackground:ます。主な違いは、後者でバックグラウンド タスクを開始できることです。

(もう 1 つの違いは、-applicationWillTerminate で「クリーンアップ」を行う場合があることです。アプリが終了しようとしているときにメモリを解放することは、CPU 時間を大幅に無駄にしますが、バックグラウンドに移動したばかりの場合は発生しないはずです。 .)

于 2010-11-21T18:28:29.007 に答える