Created
November 26, 2012 12:06
-
-
Save mikeabdullah/4147871 to your computer and use it in GitHub Desktop.
Recovering from "Dangling reference to an invalid object." error
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
- (BOOL)attemptRecoveryFromPossibleCascadeDeleteRuleFailureError:(NSError *)error; | |
{ | |
// Make sure it's an unknown validation error for a managed object | |
if ([error code] != NSManagedObjectValidationError) return NO; | |
if (![[error domain] isEqualToString:NSCocoaErrorDomain]) return NO; | |
NSManagedObject *object = [[error userInfo] objectForKey:NSValidationObjectErrorKey]; | |
if (![object isKindOfClass:[NSManagedObject class]]) return NO; | |
NSString *key = [[error userInfo] objectForKey:NSValidationKeyErrorKey]; | |
if (!key) return NO; | |
// Make sure it's a relationship to another MO | |
NSRelationshipDescription *relationship = [[[object entity] relationshipsByName] objectForKey:key]; | |
if (!relationship) return NO; | |
// Has the target MO been deleted? | |
NSManagedObject *invalidValue = [object valueForKey:key]; | |
if (![invalidValue isDeleted] && [invalidValue managedObjectContext]) return NO; | |
// Should deleting that have caused the problematic object to have been deleted too? | |
if ([[relationship inverseRelationship] deleteRule] != NSCascadeDeleteRule) return NO; | |
// OK, we're pretty sure the cascade delete rule wasn't honoured, so do it ourselves | |
NSLog(@"Deleting object that looks like Cascade delete rule for key %@ wasn't honoured: %@", key, object); | |
[[object managedObjectContext] deleteObject:object]; | |
return YES; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@mikeabdullah : Where we have to use this method or what is the best place to write this code?