Allow storage in non-Documents directories

Add a new class method that takes a directory parameter, and add a corresponding parameter to the private initializer. The other class methods pass nil for that new parameter. The value for the pathToStoreFile property is now calculated in the initializer, and stored in an instance variable.
This commit is contained in:
Sixten Otto
2011-04-12 12:05:14 -07:00
committed by Blake Watters
parent ecb0a5bd5e
commit cef335d02b
2 changed files with 38 additions and 12 deletions

View File

@@ -37,6 +37,7 @@ extern NSString* const RKManagedObjectStoreDidFailSaveNotification;
@interface RKManagedObjectStore : NSObject {
NSObject<RKManagedObjectStoreDelegate>* _delegate;
NSString* _storeFilename;
NSString* _pathToStoreFile;
NSManagedObjectModel* _managedObjectModel;
NSPersistentStoreCoordinator* _persistentStoreCoordinator;
NSObject<RKManagedObjectCache>* _managedObjectCache;
@@ -74,12 +75,22 @@ extern NSString* const RKManagedObjectStoreDidFailSaveNotification;
+ (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.
* 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.
*/
+ (RKManagedObjectStore*)objectStoreWithStoreFilename:(NSString *)storeFilename usingSeedDatabaseName:(NSString *)nilOrNameOfSeedDatabaseInMainBundle managedObjectModel:(NSManagedObjectModel*)nilOrManagedObjectModel;
/**
* Initialize a new managed object store backed by a SQLite database with the specified filename,
* in the specified directory. If no directory is specified, will use the app's Documents
* directory. 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.
*/
+ (RKManagedObjectStore*)objectStoreWithStoreFilename:(NSString *)storeFilename inDirectory:(NSString *)directory usingSeedDatabaseName:(NSString *)nilOrNameOfSeedDatabaseInMainBundle managedObjectModel:(NSManagedObjectModel*)nilOrManagedObjectModel;
/**
* Initialize a new managed object store with a SQLite database with the filename specified
* @deprecated

View File

@@ -13,7 +13,7 @@ NSString* const RKManagedObjectStoreDidFailSaveNotification = @"RKManagedObjectS
static NSString* const kRKManagedObjectContextKey = @"RKManagedObjectContext";
@interface RKManagedObjectStore (Private)
- (id)initWithStoreFilename:(NSString *)storeFilename usingSeedDatabaseName:(NSString *)nilOrNameOfSeedDatabaseInMainBundle managedObjectModel:(NSManagedObjectModel*)nilOrManagedObjectModel;
- (id)initWithStoreFilename:(NSString *)storeFilename inDirectory:(NSString *)nilOrDirectoryPath usingSeedDatabaseName:(NSString *)nilOrNameOfSeedDatabaseInMainBundle managedObjectModel:(NSManagedObjectModel*)nilOrManagedObjectModel;
- (void)createPersistentStoreCoordinator;
- (void)createStoreIfNecessaryUsingSeedDatabase:(NSString*)seedDatabase;
- (NSString *)applicationDocumentsDirectory;
@@ -24,6 +24,7 @@ static NSString* const kRKManagedObjectContextKey = @"RKManagedObjectContext";
@synthesize delegate = _delegate;
@synthesize storeFilename = _storeFilename;
@synthesize pathToStoreFile = _pathToStoreFile;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
@synthesize managedObjectCache = _managedObjectCache;
@@ -33,24 +34,40 @@ static NSString* const kRKManagedObjectContextKey = @"RKManagedObjectContext";
}
+ (RKManagedObjectStore*)objectStoreWithStoreFilename:(NSString *)storeFilename usingSeedDatabaseName:(NSString *)nilOrNameOfSeedDatabaseInMainBundle managedObjectModel:(NSManagedObjectModel*)nilOrManagedObjectModel {
return [[[self alloc] initWithStoreFilename:storeFilename usingSeedDatabaseName:nilOrNameOfSeedDatabaseInMainBundle managedObjectModel:nilOrManagedObjectModel] autorelease];
return [[[self alloc] initWithStoreFilename:storeFilename inDirectory:nil usingSeedDatabaseName:nilOrNameOfSeedDatabaseInMainBundle managedObjectModel:nilOrManagedObjectModel] autorelease];
}
+ (RKManagedObjectStore*)objectStoreWithStoreFilename:(NSString *)storeFilename inDirectory:(NSString *)directory usingSeedDatabaseName:(NSString *)nilOrNameOfSeedDatabaseInMainBundle managedObjectModel:(NSManagedObjectModel*)nilOrManagedObjectModel {
return [[[self alloc] initWithStoreFilename:storeFilename inDirectory:directory usingSeedDatabaseName:nilOrNameOfSeedDatabaseInMainBundle managedObjectModel:nilOrManagedObjectModel] autorelease];
}
- (id)initWithStoreFilename:(NSString*)storeFilename {
return [self initWithStoreFilename:storeFilename usingSeedDatabaseName:nil managedObjectModel:nil];
return [self initWithStoreFilename:storeFilename inDirectory:nil usingSeedDatabaseName:nil managedObjectModel:nil];
}
- (id)initWithStoreFilename:(NSString *)storeFilename usingSeedDatabaseName:(NSString *)nilOrNameOfSeedDatabaseInMainBundle managedObjectModel:(NSManagedObjectModel*)nilOrManagedObjectModel {
- (id)initWithStoreFilename:(NSString *)storeFilename inDirectory:(NSString *)nilOrDirectoryPath usingSeedDatabaseName:(NSString *)nilOrNameOfSeedDatabaseInMainBundle managedObjectModel:(NSManagedObjectModel*)nilOrManagedObjectModel {
self = [self init];
if (self) {
_storeFilename = [storeFilename retain];
if( nilOrDirectoryPath == nil ) {
nilOrDirectoryPath = [self applicationDocumentsDirectory];
}
else {
BOOL isDir;
NSAssert1([[NSFileManager defaultManager] fileExistsAtPath:nilOrDirectoryPath isDirectory:&isDir] && isDir == YES, @"Specified storage directory exists", nilOrDirectoryPath);
}
_pathToStoreFile = [[nilOrDirectoryPath stringByAppendingPathComponent:_storeFilename] retain];
if (nilOrManagedObjectModel == nil) {
nilOrManagedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
}
_managedObjectModel = [nilOrManagedObjectModel retain];
_managedObjectModel = [nilOrManagedObjectModel retain];
if (nilOrNameOfSeedDatabaseInMainBundle) {
[self createStoreIfNecessaryUsingSeedDatabase:nilOrNameOfSeedDatabaseInMainBundle];
}
[self createPersistentStoreCoordinator];
}
@@ -62,6 +79,8 @@ static NSString* const kRKManagedObjectContextKey = @"RKManagedObjectContext";
[_storeFilename release];
_storeFilename = nil;
[_pathToStoreFile release];
_pathToStoreFile = nil;
[_managedObjectModel release];
_managedObjectModel = nil;
[_persistentStoreCoordinator release];
@@ -114,10 +133,6 @@ static NSString* const kRKManagedObjectContextKey = @"RKManagedObjectContext";
return managedObjectContext;
}
- (NSString*)pathToStoreFile {
return [[self applicationDocumentsDirectory] stringByAppendingPathComponent:self.storeFilename];
}
- (void)createStoreIfNecessaryUsingSeedDatabase:(NSString*)seedDatabase {
if (NO == [[NSFileManager defaultManager] fileExistsAtPath:self.pathToStoreFile]) {
NSString* seedDatabasePath = [[NSBundle mainBundle] pathForResource:seedDatabase ofType:nil];