Permalink
Browse files

Merge pull request #238 from blackgold9/BadModelCleanup

Bad model cleanup
  • Loading branch information...
2 parents afdcfa5 + 8842d8f commit 79e08e921520628a5ee7b892cde04b18c0fc757d @blackgold9 blackgold9 committed Sep 6, 2012
View
28 MagicalRecord/Categories/NSPersistentStoreCoordinator+MagicalRecord.m
@@ -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;
View
8 MagicalRecord/Core/MagicalRecord+Options.h
@@ -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
11 MagicalRecord/Core/MagicalRecord+Options.m
@@ -10,6 +10,7 @@
static BOOL shouldAutoCreateManagedObjectModel_;
static BOOL shouldAutoCreateDefaultPersistentStoreCoordinator_;
+static BOOL shouldDeleteStoreOnModelMismatch_;
@implementation MagicalRecord (Options)
@@ -35,4 +36,14 @@ + (void) setShouldAutoCreateDefaultPersistentStoreCoordinator:(BOOL)shouldAutoCr
shouldAutoCreateDefaultPersistentStoreCoordinator_ = shouldAutoCreate;
}
++ (BOOL) shouldDeleteStoreOnModelMismatch;
+{
+ return shouldDeleteStoreOnModelMismatch_;
+}
+
++ (void) setShouldDeleteStoreOnModelMismatch:(BOOL)shouldDeleteStoreOnModelMismatch
+{
+ shouldDeleteStoreOnModelMismatch_ = shouldDeleteStoreOnModelMismatch;
+}
+
@end
View
5 MagicalRecord/Core/MagicalRecord.m
@@ -91,6 +91,11 @@ + (void) initialize;
#endif
[self setShouldAutoCreateManagedObjectModel:YES];
[self setShouldAutoCreateDefaultPersistentStoreCoordinator:NO];
+#ifdef DEBUG
+ [self setShouldDeleteStoreOnModelMismatch:YES];
+#else
+ [self setShouldDeleteStoreOnModelMismatch:NO];
+#endif
}
}
View
4 README.md
@@ -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];

0 comments on commit 79e08e9

Please sign in to comment.