Merge pull request #238 from blackgold9/BadModelCleanup

Bad model cleanup
This commit is contained in:
blackgold9
2012-09-06 09:51:04 -07:00
5 changed files with 50 additions and 6 deletions

View File

@@ -70,12 +70,30 @@ NSString * const kMagicalRecordPSCDidCompleteiCloudSetupNotification = @"kMagica
[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;

View File

@@ -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

View File

@@ -10,6 +10,7 @@
static BOOL shouldAutoCreateManagedObjectModel_;
static BOOL shouldAutoCreateDefaultPersistentStoreCoordinator_;
static BOOL shouldDeleteStoreOnModelMismatch_;
@implementation MagicalRecord (Options)
@@ -35,4 +36,14 @@ static BOOL shouldAutoCreateDefaultPersistentStoreCoordinator_;
shouldAutoCreateDefaultPersistentStoreCoordinator_ = shouldAutoCreate;
}
+ (BOOL) shouldDeleteStoreOnModelMismatch;
{
return shouldDeleteStoreOnModelMismatch_;
}
+ (void) setShouldDeleteStoreOnModelMismatch:(BOOL)shouldDeleteStoreOnModelMismatch
{
shouldDeleteStoreOnModelMismatch_ = shouldDeleteStoreOnModelMismatch;
}
@end

View File

@@ -91,6 +91,11 @@ void reset_action_queue(void);
#endif
[self setShouldAutoCreateManagedObjectModel:YES];
[self setShouldAutoCreateDefaultPersistentStoreCoordinator:NO];
#ifdef DEBUG
[self setShouldDeleteStoreOnModelMismatch:YES];
#else
[self setShouldDeleteStoreOnModelMismatch:NO];
#endif
}
}

View File

@@ -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];