NSManagedObjectModel initWithContentsOfURL returns nil eventhough the modelURL is valid

Viewed 8841

my NSManagedObjectModel is returning nil eventhough the path is correct.

        NSString *modelKey = [NSString stringWithFormat:@"/%@/Model", name];
    NSString *modelPath = [((Configuration *)[Configuration shared]) stringEntry:modelKey];
    NSURL *modelURL = nil;
    if ( ! [modelPath contains:@"://"] ) {
        modelPath = PathForBundleResource( modelPath );
        modelURL = [NSURL fileURLWithPath:modelPath];
    }
    NSManagedObjectModel *m = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

NSString *PathForBundleResource(NSString *relativePath)

    NSString* resourcePath = [[NSBundle mainBundle] resourcePath];
return [resourcePath stringByAppendingPathComponent:relativePath];

I've reset the simulator, did a clean build but nothing helped.

I'm new to iPhone programming (core data in particular).

Would appreciate any help.

Edit: I've edited the original post regarding the xcdatamodeld file. It wasn't linked up properly initially but now it is and still having the same problem.

Edit 2: Apparently the name of the xcdatamodel had some variations to the name of the xcdatamodel after linkage. It's working now. Feeling so stupid. Don't know how to delete this question.

6 Answers

The by far safest way, if you have not yet versioned your model, is to do the following.

  1. Do not rename your xcdatamodeld file.
  2. Instead, create a brand new Data Model file with the new name.
  3. Keep the file empty and quit Xcode
  4. Open up a terminal and cd (change directory) into your old xcdatamodeld directory.
  5. Inside this directory should be a directory ending in xcdatamodel. Change into this directory.
  6. Inside the xcdatamodel directory you will find a file named contents. Copy this file into the same location under your newly named ?.xcdatamodeld/?.xcdatamodel directory.
  7. Open up Xcode and modify your Core Data code to access this new model.
  8. Build and test.
  9. Remove the old xcdatamodeld from your project.

This works with basic models that have no versions.

Related