Wednesday, December 05, 2012

Core Data Helper Macro

I pretty much love core data.  It can be frustrating sometimes but for the most part it's pretty awesome.

One of the crazy things about it is if you get an error and try to figure things out by doing this:

    NSError *error;
    if (![managedObjectContext save:&error])
        NSLog(@"Error saving User: %@", [error localizedDescription]);

You get a good error - something like "Operation could not be completed: cocoa error code 1560".

Not very helpful.  I just stumbled across this little nugget of information from back in 2009!  All of these years of suffering I have been through.  Basically the gist of the article is you create a macro like this:

#define FT_SAVE_MOC(_ft_moc) \
do { \
    NSError* _ft_save_error; \
    if(![_ft_moc save:&_ft_save_error]) { \
        NSLog(@"Failed to save to data store: %@", [_ft_save_error localizedDescription]); \
        NSArray* _ft_detailedErrors = [[_ft_save_error userInfo] objectForKey:NSDetailedErrorsKey]; \
        if(_ft_detailedErrors != nil && [_ft_detailedErrors count] > 0) { \
            for(NSError* _ft_detailedError in _ft_detailedErrors) { \
                NSLog(@"DetailedError: %@", [_ft_detailedError userInfo]); \
            } \
        } \
        else { \
            NSLog(@"%@", [_ft_save_error userInfo]); \
        } \
    } \
} while(0);

and when you save like this:


If you get an error you actually get useful information! 

Core Data just got better!