• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Core Data: Simply set NSMigratePersistentStoresAutomaticallyOption in a Document?
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Core Data: Simply set NSMigratePersistentStoresAutomaticallyOption in a Document?


  • Subject: Re: Core Data: Simply set NSMigratePersistentStoresAutomaticallyOption in a Document?
  • From: Jerry Krinock <email@hidden>
  • Date: Thu, 19 Nov 2009 17:42:53 -0800

On 2009 Nov 19, at 14:05, Matthew Lindfield Seager wrote:

> I can't help with your question but Googling
> "NSMigratePersistentStoresAutomaticallyOption site:lists.apple.com"
> yields 36 results. There's probably several duplicates but it give you
> a head start....

Hmmm.  When I tried that this morning I only got 19.  Among the additional 17, I found this:

http://lists.apple.com/archives/cocoa-dev/2008/Aug/msg00767.html

Summary: There is no need to muck with NSPersistentDocument's built-in and bug-free Persistence Stack.  Happy Day!  All you do is override -[NSPersistentDocument initWithContentsOfURL:ofType:error:].  I submitted document feedback suggesting this to the Core Data Model Versioning and Data Migration Programming Guide.

Thanks, Matthew.

The code in that post had issues and didn't quite work, so I fixed it up and it now seems to "just work" now for all three cases (1) oldest docs saved with old model (2) old docs with new model (3) new docs.  In case (1) the old file remains with a tilde suffix, as expected.  In case (3), the method doesn't even run.  But when it does, it handles errors properly :)

So, the answer to the question: How to enable Default Automatic Migration in a Core Data document-based app, is...

Simply drop the following override into the NSPersistentDocument subclass:

- (id)initWithContentsOfURL:(NSURL*)url
                     ofType:(NSString*)typeName
                      error:(NSError**)error_p {
    // NSPersistentDocument's built-in Persistence Stack seems to create a store
    // without setting the NSMigratePersistentStoresAutomaticallyOption, so
    // automatic migration just "doesn't work".  The following code, which runs
    // only for existing documents, works around that problem.
    NSError* error = nil ;
    NSArray* bundles = [NSArray arrayWithObject:[NSBundle mainBundle]] ;
    NSManagedObjectModel* mergedMOM = [NSManagedObjectModel mergedModelFromBundles:bundles] ;
    NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mergedMOM];
    NSDictionary *optionsDictionary =
    [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES]
                                forKey:NSMigratePersistentStoresAutomaticallyOption];

    id store = [psc addPersistentStoreWithType:NSSQLiteStoreType
                                 configuration:nil
                                           URL:url
                                       options:optionsDictionary
                                         error:&error] ;
    // If migrating the document from and older to the current model was necessary,
    // it is now all done!  The addPersistentStoreWithType::::: will have renamed the
    // old file with a tilde on the end and created a new, migrated file at the given
    // URL.  So now, when we invoke super, it will open the new file and just work.
    // Very nice.

    if (store) {
        self = [super initWithContentsOfURL:url
                                     ofType:typeName
                                      error:&error] ;
        // The above method will return nil if it fails.
    }
    else {
        [self release] ;
        self = nil ;
    }

    if (!self && error_p) {
        *error_p = error ;
    }

    return self;
}

_______________________________________________

Cocoa-dev mailing list (email@hidden)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden

  • Follow-Ups:
    • Core Data: Specifying latest .mom resource. Was: NSMigratePersistentStoresAutomaticallyOption...
      • From: Jerry Krinock <email@hidden>
References: 
 >Core Data: Simply set NSMigratePersistentStoresAutomaticallyOption in a Document? (From: Jerry Krinock <email@hidden>)
 >Re: Core Data: Simply set NSMigratePersistentStoresAutomaticallyOption in a Document? (From: Matthew Lindfield Seager <email@hidden>)

  • Prev by Date: Re: tiffs on pasteboard
  • Next by Date: Re: Where are the interface builder components?
  • Previous by thread: Re: Core Data: Simply set NSMigratePersistentStoresAutomaticallyOption in a Document?
  • Next by thread: Core Data: Specifying latest .mom resource. Was: NSMigratePersistentStoresAutomaticallyOption...
  • Index(es):
    • Date
    • Thread