shouldDeleteInaccessibleFaults:
〜YES
に設定し、アクセスできない/できないフォルトを削除します。これはすぐに問題を解決します。
コアデータの新機能WWDC 2015セッションではこれについて少し話します。 NSBatchDeleteRequest
とNSBatchUpdateRequest
の両方は、NSManagedObjectContext
の参加なしで永続ストアを変更します。その結果、データのコンテキストのビューはストアと矛盾します。
削除されたオブジェクトのメモリ内コピーは、NSManagedObjectContext
で更新する必要があります。削除されたオブジェクトのオブジェクトIDをバッチ削除要求で返し、それらのIDをリフレッシュするようにNSManagedObjectContext
に指示します。これは次のようになります
:
[managedObjectContext performBlock:^{
NSBatchDeleteRequest batchDeleteRequest = [NSBatchDeleteRequest alloc] initWithFetchRequest:fetchRequest];
NSBatchDeleteResult result = nil;
result = [managedObjectContext executeRequest:batchDeleteRequest error:&error];
if ([[result result] count] > 0){
[managedObjectContext performBlock:^{
NSArray<NSManagedObjectID *> *objectIDs = (NSArray<NSManagedObjectID *>)[result result];
[objectIDs enumerateObjectsUsingBlock:^(NSManagedObjectID *objID, NSUInteger idx, BOOL *stop) {
NSError *error = nil;
NSManagedObject *obj = [managedObjectContext existingObjectWithID:objID error:&error];
if (![obj isFault]) {
[managedObjectContext refreshObject:obj mergeChanges:YES];
}
}];
}];
}
}];
バッチが実行を削除
は、関係が削除または無効化が、削除規則のカスケードセットが実行されない場合があり、および検証ルールは実行されませんされますバッチ変更要求のいずれかを使用する場合は、データの整合性を保証することはアプリケーションの責任です。
データモデルでは、関連オブジェクトが孤立していても見つけられないように、複数の削除要求を発行する必要があります。たとえば、空のリレーションシップを持つ以前に関連したエンティティを見つけるには、2回目のバッチ削除が必要な場合があります。など
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"[email protected] == 0"];
または副問合せを使用することができ、
どのような削除ルールをお使いですか? – Shizam
@Shizam Nullifyを使用しています – Serluca
レコード数はいくつですか?10.000未満ですか?オブジェクトグラフを使用することもできます。 – Mundi