Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bad model cleanup #238

Merged
merged 5 commits into from Sep 6, 2012
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -70,12 +70,30 @@ - (NSPersistentStore *) MR_addSqliteStoreNamed:(id)storeFileName withOptions:(__
[self MR_createPathToStoreFileIfNeccessary:url];

NSPersistentStore *store = [self addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:url
options:options
error:&error];
if (!store)
configuration:nil
URL:url
options:options
error:&error];

if (!store && [MagicalRecord shouldDeleteStoreOnModelMismatch])
{
if ([error.domain isEqualToString:NSCocoaErrorDomain] &&
[error code] == NSMigrationMissingSourceModelError) {
// Could not open the database, so... kill it!
[[NSFileManager defaultManager] removeItemAtURL:url error:nil];

// Try one more time to create the store
store = [self addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:url
options:options
error:&error];
if (store) {
// If we successfully added a store, remove the error that was initially created
error = nil;
}
}

[MagicalRecord handleErrors:error];
}
return store;
Expand Down
8 changes: 8 additions & 0 deletions MagicalRecord/Core/MagicalRecord+Options.h
Expand Up @@ -20,6 +20,14 @@
+ (void) setShouldAutoCreateManagedObjectModel:(BOOL)shouldAutoCreate;
+ (BOOL) shouldAutoCreateDefaultPersistentStoreCoordinator;
+ (void) setShouldAutoCreateDefaultPersistentStoreCoordinator:(BOOL)shouldAutoCreate;
+ (void) setShouldDeleteStoreOnModelMismatch:(BOOL)shouldDeleteStoreOnModelMismatch;

/*!
@method shouldDeleteStoreOnModelMistmatch
@abstract If true, when configuring the persistant store coordinator, and Magical Record encounters a store that does not match the model, it will attempt to remove it and re-create a new store.
This is extremely useful during development where every model change could potentially require a delete/reinstall of the app.
*/
+ (BOOL) shouldDeleteStoreOnModelMismatch;


@end
11 changes: 11 additions & 0 deletions MagicalRecord/Core/MagicalRecord+Options.m
Expand Up @@ -10,6 +10,7 @@

static BOOL shouldAutoCreateManagedObjectModel_;
static BOOL shouldAutoCreateDefaultPersistentStoreCoordinator_;
static BOOL shouldDeleteStoreOnModelMismatch_;

@implementation MagicalRecord (Options)

Expand All @@ -35,4 +36,14 @@ + (void) setShouldAutoCreateDefaultPersistentStoreCoordinator:(BOOL)shouldAutoCr
shouldAutoCreateDefaultPersistentStoreCoordinator_ = shouldAutoCreate;
}

+ (BOOL) shouldDeleteStoreOnModelMismatch;
{
return shouldDeleteStoreOnModelMismatch_;
}

+ (void) setShouldDeleteStoreOnModelMismatch:(BOOL)shouldDeleteStoreOnModelMismatch
{
shouldDeleteStoreOnModelMismatch_ = shouldDeleteStoreOnModelMismatch;
}

@end
5 changes: 5 additions & 0 deletions MagicalRecord/Core/MagicalRecord.m
Expand Up @@ -91,6 +91,11 @@ + (void) initialize;
#endif
[self setShouldAutoCreateManagedObjectModel:YES];
[self setShouldAutoCreateDefaultPersistentStoreCoordinator:NO];
#ifdef DEBUG
[self setShouldDeleteStoreOnModelMismatch:YES];
#else
[self setShouldDeleteStoreOnModelMismatch:NO];
#endif
}
}

Expand Down
4 changes: 3 additions & 1 deletion README.md
Expand Up @@ -81,7 +81,9 @@ Next, somewhere in your app delegate, in either the applicationDidFinishLaunchin

Each call instantiates one of each piece of the Core Data stack, and provides getter and setter methods for these instances. These well known instances to MagicalRecord, and are recognized as "defaults".

And, before your app exits, you can use the clean up method:
When using the default sqlite data store with the DEBUG flag set, if you change your model without creating a new model version, Magical Record will delete the old store and create a new one automatically. No more uninstall/reinstall every time you make a change!

And finally, before your app exits, you can use the clean up method:

[MagicalRecord cleanUp];

Expand Down