SO 内を検索しましたが、関係を処理するときにコア データの管理対象オブジェクトを削除する際のパフォーマンスを向上させるための提案は見つかりませんでした。
シナリオは非常に単純です。
ご覧のとおり、3 つの異なるエンティティがあります。各エンティティは、次のエンティティとカスケードでリンクされています。たとえば、FirstLevel
には と呼ばれる関係がありsecondLevels
ますSecondLevel
。からFirstLevel
へのデリート ルールSecondLevel
はCascadeSecondLevel
で、 からへのデリート ルールFirstLevel
はNullifyです。SecondLevel
と の間に同じ規則が適用されThirdLevel
ます。
グラフ全体を削除したい場合は、次のような方法を実行します。
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"FirstLevel" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSError *error = nil;
NSArray *items = [context executeFetchRequest:fetchRequest error:&error];
[fetchRequest release];
// delete roots object and let Core Data to do the rest...
for (NSManagedObject *managedObject in items) {
[context deleteObject:managedObject];
}
カスケードルールを利用して、グラフを削除します。これは少数のオブジェクトでは高速に機能しますが、多くのオブジェクトではパフォーマンスが低下します。さらに、このタイプの削除では、ディスクへの往復が多いと思います (よくわかりませんが)。間違っていますか?
したがって、私の質問は次のとおりです。カスケードルールを利用せずにグラフを削除してパフォーマンスを向上させると同時に、グラフの一貫性を維持するにはどうすればよいでしょうか?
前もって感謝します。
編集
モデルに他のエンティティがあるため、ファイル全体を削除できません。
編集2
私が投稿したコードは、サブクラスのmain
メソッドにラップされています。NSOperation
このソリューションにより、削除フェーズをバックグラウンドで実行できます。カスケード ルールを利用したため、削除は半自動で実行されます。FirstLevel
投稿されたコード内の for ループを使用して、アイテムであるルート オブジェクトのみを削除します。このようにして、Core Data が残りの作業を行ってくれます。私が疑問に思っているのは次のことです:グラフの一貫性を失うことなく、その半自動削除操作をバイパスして手動で行うことは可能ですか?