アプリのデータベースは、数層の深さでネストされたオブジェクトで構成されています。アーキテクチャ上の理由から、現時点でこれを移行することは現実的ではありません。
毎日、かなりの割合のデータが期限切れになります。データベースのサイズが大きくなると、アプリのパフォーマンスが低下します。
したがって、データベースを小さく保つ効果的な方法を見つける必要があり (少なくともこのリリースでは)、次のいずれかの方法を検討しています。
applicationWillResignActive の間、ルート レベルですべてのオブジェクトを反復処理し、それぞれに対して delete を呼び出し、削除を「to-many」オブジェクトの 3 つのレイヤーにカスケードできるようにすることで、NSManagedObjects を削除します。これには、最後に 1 つのコンテキストを保存して、すべてを DB にコミットすることが含まれます。多くの場合、オブジェクトの削除には 10 ~ 20 秒 (iPhone 4 の場合) かかり、Springboard は 10 秒でプロセスを終了します。これの主な欠点の 1 つは、コンテキストの保存が 10 秒のタイムアウトまでに完了しない場合、何も削除されず、ユーザーがアプリを実行するたびに DB が拡大し続けることです。
didFinishLaunchingWithOptions または applicationDidBecomeActive 内、または applicationWillResignActive 内の sqlite ファイル全体を削除します。これにより、削除されたデータを表示しようとするのを避けるために、アプリのビュー コントローラー スタックのルートにポップすることが強制されます。これの最大の欠点は、ユーザーが次にアプリを起動したときに何かを実行できるようになるまでに、アプリが数秒間データをダウンロードして解析する必要があることです。
ユーザーがホームボタンまたは電源ボタンを押した後、beginBackgroundTaskWithExpirationHandler を使用して DB オブジェクトを削除します。これに関連して、それを怖がらせる未知数があります。誰かがこの方法で(成功して)やっていますか?
アプリの実行中に、オブジェクトの小さなグループを段階的に削除します。これにより、デバイスの負荷が増加し、テーブルビューの滑らかさが損なわれ、ぎくしゃくします。古いオブジェクトの削除と同時に API 呼び出しによって既に解析されているデータの量は、ここでは実用的ではないようです。
コア データ内のオブジェクトを削除するためのベスト プラクティスについての考えをいただければ幸いです。