More improvements to the managed object store and seeding API's

This commit is contained in:
Blake Watters
2011-03-05 17:05:31 -05:00
parent e07d87939f
commit 3cf66e5385
7 changed files with 43 additions and 12 deletions

View File

@@ -8,6 +8,9 @@
#import "../ObjectMapping/ObjectMapping.h"
// The default seed database filename. Used when the object store has not been initialized
extern NSString* const RKDefaultSeedDatabaseFileName;
@protocol RKManagedObjectSeederDelegate
@required

View File

@@ -14,6 +14,8 @@
- (void)seedObjectsFromFileNames:(NSArray*)fileNames;
@end
NSString* const RKDefaultSeedDatabaseFileName = @"RKSeedDatabase.sqlite";
@implementation RKManagedObjectSeeder
@synthesize delegate = _delegate;
@@ -46,6 +48,11 @@
if (self) {
_manager = [manager retain];
// If the user hasn't configured an object store, set one up for them
if (nil == _manager.objectStore) {
_manager.objectStore = [RKManagedObjectStore objectStoreWithStoreFilename:RKDefaultSeedDatabaseFileName];
}
// Delete any existing persistent store
[_manager.objectStore deletePersistantStore];
}
@@ -123,7 +130,7 @@
NSString* storeFileName = [[_manager objectStore] storeFilename];
NSString* destinationPath = [basePath stringByAppendingPathComponent:storeFileName];
NSLog(@"[RestKit] RKManagedObjectSeeder: A seeded database has been generated at '%@'. "
@"Please execute `open %@` in your Terminal and copy %@ to your app. Be sure to add the seed database to your \"Copy Resources\" build phase.",
@"Please execute `open \"%@\"` in your Terminal and copy %@ to your app. Be sure to add the seed database to your \"Copy Resources\" build phase.",
destinationPath, basePath, storeFileName);
exit(1);

View File

@@ -50,14 +50,20 @@ extern NSString* const RKManagedObjectStoreDidFailSaveNotification;
/**
* Initialize a new managed object store with a SQLite database with the filename specified
*/
- (id)initWithStoreFilename:(NSString*)storeFilename;
+ (RKManagedObjectStore*)objectStoreWithStoreFilename:(NSString*)storeFilename;
/**
* Initialize a new managed object store backed by a SQLite database with the specified filename. If a seed database name is provided
* and no existing database is found, initialize the store by copying the seed database from the main bundle. If the managed object model
* provided is nil, all models will be merged from the main bundle for you.
*/
- (id)initWithStoreFilename:(NSString *)storeFilename usingSeedDatabaseName:(NSString *)nilOrNameOfSeedDatabaseInMainBundle managedObjectModel:(NSManagedObjectModel*)nilOrManagedObjectModel;
+ (RKManagedObjectStore*)objectStoreWithStoreFilename:(NSString *)storeFilename usingSeedDatabaseName:(NSString *)nilOrNameOfSeedDatabaseInMainBundle managedObjectModel:(NSManagedObjectModel*)nilOrManagedObjectModel;
/**
* Initialize a new managed object store with a SQLite database with the filename specified
* @deprecated
*/
- (id)initWithStoreFilename:(NSString*)storeFilename DEPRECATED_ATTRIBUTE;
/**
* Save the current contents of the managed object store
@@ -89,5 +95,4 @@ extern NSString* const RKManagedObjectStoreDidFailSaveNotification;
*/
- (RKManagedObject*)findOrCreateInstanceOfManagedObject:(Class)class withPrimaryKeyValue:(id)primaryKeyValue;
@end

View File

@@ -13,6 +13,7 @@ NSString* const RKManagedObjectStoreDidFailSaveNotification = @"RKManagedObjectS
static NSString* const kRKManagedObjectContextKey = @"RKManagedObjectContext";
@interface RKManagedObjectStore (Private)
- (id)initWithStoreFilename:(NSString *)storeFilename usingSeedDatabaseName:(NSString *)nilOrNameOfSeedDatabaseInMainBundle managedObjectModel:(NSManagedObjectModel*)nilOrManagedObjectModel;
- (void)createPersistentStoreCoordinator;
- (void)createStoreIfNecessaryUsingSeedDatabase:(NSString*)seedDatabase;
- (NSString *)applicationDocumentsDirectory;
@@ -26,15 +27,26 @@ static NSString* const kRKManagedObjectContextKey = @"RKManagedObjectContext";
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
@synthesize managedObjectCache = _managedObjectCache;
+ (RKManagedObjectStore*)objectStoreWithStoreFilename:(NSString*)storeFilename {
return [self objectStoreWithStoreFilename:storeFilename usingSeedDatabaseName:nil managedObjectModel:nil];
}
+ (RKManagedObjectStore*)objectStoreWithStoreFilename:(NSString *)storeFilename usingSeedDatabaseName:(NSString *)nilOrNameOfSeedDatabaseInMainBundle managedObjectModel:(NSManagedObjectModel*)nilOrManagedObjectModel {
return [[[self alloc] initWithStoreFilename:storeFilename usingSeedDatabaseName:nilOrNameOfSeedDatabaseInMainBundle managedObjectModel:nilOrManagedObjectModel] autorelease];
}
- (id)initWithStoreFilename:(NSString*)storeFilename {
return self = [self initWithStoreFilename:storeFilename usingSeedDatabaseName:nil managedObjectModel:[NSManagedObjectModel mergedModelFromBundles:nil]];
return self = [self initWithStoreFilename:storeFilename usingSeedDatabaseName:nil managedObjectModel:nil];
}
- (id)initWithStoreFilename:(NSString *)storeFilename usingSeedDatabaseName:(NSString *)nilOrNameOfSeedDatabaseInMainBundle managedObjectModel:(NSManagedObjectModel*)nilOrManagedObjectModel {
self = [self init];
if (self) {
_storeFilename = [storeFilename retain];
_managedObjectModel = [nilOrManagedObjectModel retain];
if (nilOrManagedObjectModel == nil) {
nilOrManagedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
}
_managedObjectModel = [nilOrManagedObjectModel retain];
if (nilOrNameOfSeedDatabaseInMainBundle) {
[self createStoreIfNecessaryUsingSeedDatabase:nilOrNameOfSeedDatabaseInMainBundle];
}
@@ -109,7 +121,7 @@ static NSString* const kRKManagedObjectContextKey = @"RKManagedObjectContext";
NSError* error = nil;
if (NO == [[NSFileManager defaultManager] fileExistsAtPath:self.pathToStoreFile]) {
NSString* seedDatabasePath = [[NSBundle mainBundle] pathForResource:seedDatabase ofType:nil];
NSAssert1(seedDatabasePath, @"Unable to find seed database file '%@' in the Main Bundle, aborting...", seedDatabasePath);
NSAssert1(seedDatabasePath, @"Unable to find seed database file '%@' in the Main Bundle, aborting...", seedDatabase);
NSLog(@"No existing database found, copying from seed path '%@'", seedDatabasePath);
[[NSFileManager defaultManager] copyItemAtPath:seedDatabasePath toPath:self.pathToStoreFile error:&error];
if (error) {