Core Data: Simply set NSMigratePersistentStoresAutomaticallyOption in a Document?

2009-11-19 Thread Jerry Krinock
Well, it's time to move my beta testers from 0.1.8 to 0.1.9 and this requires a 
Core Data database migration.  Since the app requires 10.5, I can use Default 
Automatic Migration.  Yippee.

Up to this point, my NSPersistentDocument subclass had used the Persistence 
Stack which is built into NSPersistentDocument.  However, this stack apparently 
does not create set NSMigratePersistentStoresAutomaticallyOption in its store.  
It looks to me like I need to override -managedObjectContext and implement 
that whole persistence stack enchilada just to set this one little, 
commonly-used option.  Is there a shortcut?

If indeed I need to implement the stack, where is the best place to splice in 
the pieces?  I had been creating new documents from a wizard using 
-[NSDocumentController openUntitledDocumentAndDisplay:error:], and doing some 
configuration which required the moc at the end of -init.  Now that doesn't 
work since I can't set a store in new documents before the fileURL has been 
set, which happens later.  I'm imagining many ways to move things around, but 
I'd like to start out by doing it the *right* way.

Sincerely,

Jerry Krinock


P.S.  Sorry if this is in the list archives but since cocoabuilder.com is down 
I'm searching lists.apple.com.  Searching with
   Search for: NSMigratePersistentStoresAutomaticallyOption 
   Match: All
   Find: Substring
   Located In: Whole Document
   Listname Matches: cocoa-dev

I get:  

Sorry, your search for NSMigratePersistentStoresAutomaticallyOption did not 
find any results.
No documents were found containing 
NSMigratePersistentStoresAutomaticallyOption.

Seems unbelievable.___

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com


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

2009-11-19 Thread Matthew Lindfield Seager
 P.S.  Sorry if this is in the list archives but since cocoabuilder.com is 
 down I'm searching lists.apple.com.  Searching with
   Search for: NSMigratePersistentStoresAutomaticallyOption
   Match: All
   Find: Substring
   Located In: Whole Document
   Listname Matches: cocoa-dev

 I get:

 Sorry, your search for NSMigratePersistentStoresAutomaticallyOption did not 
 find any results.
 No documents were found containing 
 NSMigratePersistentStoresAutomaticallyOption.

 Seems unbelievable.

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

Matt
___

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com


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

2009-11-19 Thread Jerry Krinock
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 (Cocoa-dev@lists.apple.com)

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:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com