NSFetchRequest could not locate an NSEntityDescription for entity name

9

I've tried the proposed solutions for similar questions on SO but with no luck. The fetch request can't locate the entity name 'GarmentType'.

Here is my data model: enter image description here

The error is thrown at the executeFetchRequest in this helper category:

//
//  GarmentType+Create.m
//  Dressy
//
//  Created by Michael Mangold on 9/4/13.
//  Copyright (c) 2013 Michael Mangold. All rights reserved.
//

#import "GarmentType+Create.h"

@implementation GarmentType (Create)

// Creates or fetches a Core Data GarmentType entity.
+ (GarmentType *)garmentTypeWithName:(NSString *)name inManagedObjectContext:(NSManagedObjectContext *)context
{
    NSLog(@"name:%@ context:%@",name,context);
    GarmentType *garmentType = nil;

    // Build fetch request.
    NSFetchRequest *request          = [NSFetchRequest fetchRequestWithEntityName:@"GarmentType"];
    request.sortDescriptors          = @[[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]];
    request.predicate                = [NSPredicate predicateWithFormat:@"name = %@",name];

    // Execute fetch requesst.
    NSError *error  = nil;
    NSArray *matches = [context executeFetchRequest:request error:&error]; // This is where it dies.

    if (!matches || [matches count] > 1) {
        NSLog(@"Error creating GarmentType.");
    } else if ([matches count] == 0) {
        garmentType          = [NSEntityDescription insertNewObjectForEntityForName:@"GarmentType" inManagedObjectContext:context];
        garmentType.name     = name;
    } else {
        garmentType = [matches lastObject];
    }

    return garmentType;
}

@end

The name logs the correct name and the context is non nil.

The helper is called from a UITableViewController IBAction when the 'done' button is pressed:

- (IBAction)handleDoneButton:(UIBarButtonItem *)sender
{
    // Add garment type to core data.
    [DressyHelper openDocumentUsingBlock:^(UIManagedDocument *document){
        GarmentType *newGarment = [GarmentType garmentTypeWithName:self.garmentTypeNameTextField.text inManagedObjectContext:document.managedObjectContext];
        NSLog(@"newGarment.name:%@",newGarment.name);
    }];
    [self dismissViewControllerAnimated:YES completion:nil];
}

newGarment.name logs fine.

Here is the .h for GarmentType:

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@class Garment;

@interface GarmentType : NSManagedObject

@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSSet *garments;
@end

@interface GarmentType (CoreDataGeneratedAccessors)

- (void)addGarmentsObject:(Garment *)value;
- (void)removeGarmentsObject:(Garment *)value;
- (void)addGarments:(NSSet *)values;
- (void)removeGarments:(NSSet *)values;

@end

Apologies for the code dump but I've been struggling with this for a while. Changing the entity name results in the same error, just with the new name as the entity not found.

Inspector for GarmentType: enter image description here

And the exception:

2013-12-10 13:51:50.320 Dressy[4336:70b] name:asdf context:<NSManagedObjectContext: 0x8ad86f0>
2013-12-10 13:51:50.323 Dressy[4336:70b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'NSFetchRequest could not locate an NSEntityDescription for entity name 'GarmentType''
*** First throw call stack:
(
    0   CoreFoundation                      0x017465e4 __exceptionPreprocess + 180
    1   libobjc.A.dylib                     0x014c98b6 objc_exception_throw + 44
    2   CoreData                            0x019b4b6e -[NSFetchRequest(_NSInternalMethods) _resolveEntityWithContext:] + 510
    3   CoreData                            0x019b34d6 -[NSManagedObjectContext executeFetchRequest:error:] + 70
    4   Dressy                              0x000051de +[GarmentType(Create) garmentTypeWithName:inManagedObjectContext:] + 510
    5   Dressy                              0x00002170 __54-[GarmentTypeAddTableViewController handleDoneButton:]_block_invoke + 208
    6   Dressy                              0x00006d51 __39+[DressyHelper openDocumentUsingBlock:]_block_invoke21 + 97
    7   UIKit                               0x00781f7b __59-[UIDocument saveToURL:forSaveOperation:completionHandler:]_block_invoke570 + 54
    8   libdispatch.dylib                   0x01e43440 _dispatch_barrier_sync_f_slow_invoke + 71
    9   libdispatch.dylib                   0x01e544b0 _dispatch_client_callout + 14
    10  libdispatch.dylib                   0x01e4275e _dispatch_main_queue_callback_4CF + 340
    11  CoreFoundation                      0x017aba5e __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 14
    12  CoreFoundation                      0x016ec6bb __CFRunLoopRun + 1963
    13  CoreFoundation                      0x016ebac3 CFRunLoopRunSpecific + 467
    14  CoreFoundation                      0x016eb8db CFRunLoopRunInMode + 123
    15  GraphicsServices                    0x03a4d9e2 GSEventRunModal + 192
    16  GraphicsServices                    0x03a4d809 GSEventRun + 104
    17  UIKit                               0x00237d3b UIApplicationMain + 1225
    18  Dressy                              0x0000585d main + 141
    19  libdyld.dylib                       0x020e670d start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 

TIA

ios
iphone
objective-c
core-data
asked on Stack Overflow Dec 10, 2013 by Michael Mangold • edited Dec 10, 2013 by Michael Mangold

3 Answers

21

I finally found the problem. The .xcdatamodel wasn't included in the target membership. Selecting the xcdatamodel in the navigator pane on the left in Xcode, then selecting the first tab (File inspector) in the Utilities pane on the right, then selecting the data model in the Target Membership section fixes the problem. Thank you so much to everyone who responded.

enter image description here

answered on Stack Overflow Dec 11, 2013 by Michael Mangold
4

The Entity diagram with Entity names is only half of the puzzle. For each entity, what have you defined the class names as? That is what fetchRequestWithEntityName: will go against.

EDIT:

Since the class name is resolved, what is the exception you are getting? After you continue, does CoreData explain what the problem is that it had? Does the application actually crash (I ask that because if you have a breakpoint set for exceptions, Core Data will often throw internal exceptions that don't matter or cause the application to crash)?

EDIT2:

The crash doesn't say much beyond us knowing you have a valid context. The next step would be, to list all of the entities at a breakpoint set just before the fetch request, using code like:

NSManagedObjectModel *managedObjectModel = [[context persistentStoreCoordinator] managedObjectModel];
NSDictionary *entities = [managedObjectModel entitiesByName];
NSArray *entityNames = [entities allKeys];
NSLog(@"All loaded entities are: %@", entityNames);
answered on Stack Overflow Dec 10, 2013 by Kendall Helmstetter Gelner • edited Dec 11, 2013 by Kendall Helmstetter Gelner
1

I got this after creating a new model version with a new entity, but forgetting to update data file URL:

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Data2.0" <==== Here
                                          withExtension:@"mom"
                                           subdirectory:@"Data.momd"];

_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
answered on Stack Overflow Nov 19, 2015 by meaning-matters • edited Nov 19, 2015 by meaning-matters

User contributions licensed under CC BY-SA 3.0