views:

47

answers:

1

I have an iPhone app that is using CoreData. I recently made some minor changes to the data model and now every time the app is opened I get an error "Can't find model for source store".

I have 2 version of the data model and the only changes I've made were some additions of some fields. I was following the guide here which worked initially, then just today, after adding some additional fields, it breaks. All additional fields are marked as optional and all have default values. The migration code is below:

    NSURL *storeUrl = [NSURL fileURLWithPath:[[self applicationDocumentsDirectory] stringByAppendingPathComponent:@"xxx.sqlite"]];

// migration options
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                         [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                         [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

NSError *error = nil;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
...
}

The managedObjectModel is successfully created here:

- (NSManagedObjectModel *)managedObjectModel {

if (managedObjectModel != nil) {
    return managedObjectModel;
}

NSString *path = [[NSBundle mainBundle] pathForResource:@"DataModelName" ofType:@"momd"];
NSURL *momURL = [NSURL fileURLWithPath:path];
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];

return managedObjectModel;

}

I've tracked down the issue to a mismatch in the version has for 1 entity. The error that gets thrown includes this has for the entity:

MyEntityName = <cc1456b7 b12d0d05 21930308 94ccc078 27a6c345 8847c738 e3a9ae7e 0be9535d>;

but the hash in the VersionInfo.plist in the app bundle is:

MyEntityName = <fede6b59 462442d1 8fc98226 b9f8f745 3250dabd ee188248 cb97b1d0 8a74eef3>;

There are no other entities anywhere in the VersionInfo.plist with the hash .

I'm slowly losing my mind trying to figure out what could be causing this!

A: 

From the linked answer,

This seems great and as simple as I wanted - but I think you need to be careful during development as you change a model - otherwise you will have to create a new version for each change.

It sounds like you made version 2, edited version 2, ran the app, edited version 2 again, and ran the app again. This doesn't work so well; you need to save all the model versions you expect to be able to open. This is a bit of a hassle.

What you could do is name all your models after app versions, e.g. FooModel-1 and FooModel-1.1 corresponding to releases, and FooModel-1.2d1, FooModel-1.2d2 for "development" versions. Before release, you can rename FooModel-1.2d10 to FooModel-1.2 and remove the other development versions.

(Or I could be entirely misreading the question; sorry.)

tc.
I definitely did edit version 2 after running the app. What would be the best way to go ahead with this? I definitely don't want to release this into production and have users lose their data because I messed up during dev. Could I create a version 3 with the final edits and be good to go?
Colin
If you haven't released version 2 to users, then they won't have any problems. You're having problems because you saved with "old version 2" and are trying to load it with "new version 2". Adding new unnecessary model versions doesn't hurt, though; it just makes your app a bit bigger.
tc.
Excellent. I was freaking out a bit as some of our internal testers were getting errors but likely due to the same issue I was having running a version with multiple changes.
Colin