How do I set up Core Data lightweight migration using MagicalRecord?
Asked Answered
D

3

6

I have hit a brick wall trying to setup lightweight migration of Core Data using MagicalRecord. I have looked at all of the posts on this subject, using Google and SO. I understand how the persistentStoreCoordinator works and what the settings I am trying to make also do.

Here's my code:

AppDeligate.h

NSPersistentStoreCoordinator *persistentStoreCoordinator;

AppDelegate.m

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

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

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

// handle db upgrade
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]) {
    
    // Handle error
}

return persistentStoreCoordinator;

}

I'm getting the following errors, which I understand; what I don't know is where are these objects (I have looked in my app, and found nothing):

No visible @interface for 'AppDelegate' declares the selector 'applicationDocumentsDirectory' and

No visible @interface for 'AppDelegate' declares the selector 'managedObjectModel'

I have already created the stores:

xcdatamodeld

Most, if not all of the code I have looked at is similar; I don't know if MagicalRecord handles this for me or not because I can't find any docs that would indicate how to do this using MR. My question is: what do I have to do to make this work?

Donohue answered 30/5, 2013 at 16:17 Comment(1)
In your last screenshot, the new model hasn't been made the active one yet, so the old model will still be used.Phosphine
L
13

The whole point of MagicalRecord is that this is managed for you:

[MagicalRecord setupCoreDataStackWithAutoMigratingSqliteStoreNamed:####];

Check the docs about the Core Data stack setup here.

Lentic answered 30/5, 2013 at 16:39 Comment(6)
Yes, I read that, but didn't realize MR would do everything for me! I had your bit of code already; thank you... One more question: if I do NOT use the DEBUG flag, but rather create the new model myself, will MR still find it, or is using the DEBUG flag the way to notify MR it needs to do the migration? If that is the case, how do I handle this when the app is in the AppStore?Donohue
The migration is handled by passing certain flags to Core Data. This causes Core Data to check the model versions that are available and use those to automatically detect and fix the differences.Lentic
MagicalRecord will load all the models in your bundle and merge them together, unless there are multiple versions of the same model, and then it'll merge only the latest version with the others. This is the default Core Data behavior in the +[NSManagedObjectModel managedObjectModelsFromBundle:] method, which is what MagicalRecord also uses to load the models.Tindall
That link appears to be dead now, and there doesn't seem to be a replacement. :(Spitball
There is github.com/magicalpanda/MagicalRecord/blob/develop/Docs/… and github.com/magicalpanda/MagicalRecord/blob/develop/Docs/…Lentic
Also make sure your model is pointed to your new model version in the xcdatamodeld file. That was my issue.Sorn
S
8

Make sure you check all of these things:

In your AppDelegate.m file:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    ...
    [MagicalRecord setupAutoMigratingCoreDataStack];
    ...
}

If you haven't versioned your model already:

  • Select your data model

Select your data model

  • Editor -> Add Model Version

    enter image description here

  • Name the new version, Finish

enter image description here

  • There should be two versions now. Select the file as shown.

enter image description here

  • Change the Model Version to your new version

enter image description here

  • The new version should be checked now

enter image description here

Sigler answered 27/8, 2015 at 20:55 Comment(0)
S
6

As of my understanding of the question, i suggest you to use this

[MagicalRecord setupAutoMigratingCoreDataStack]

If you have not changed the model version, change it to new model created from the old model

Sevier answered 25/9, 2014 at 5:34 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.