Skip to content
This repository was archived by the owner on Sep 12, 2018. It is now read-only.

Multiple Contexts Support #77

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 14 additions & 5 deletions Classes/CoreDataManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,27 @@

@interface CoreDataManager : NSObject

@property (readonly, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
@property (readonly, nonatomic) NSDictionary* managedObjectContexts;

@property (readonly, nonatomic) NSManagedObjectContext *defaultManagedObjectContext;
@property (readonly, nonatomic) NSManagedObjectModel *defaultManagedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *defaultPersistentStoreCoordinator;

@property (copy, nonatomic) NSString *databaseName;
@property (copy, nonatomic) NSString *modelName;

+ (id)instance DEPRECATED_ATTRIBUTE;
+ (instancetype)sharedManager;

- (BOOL)saveContext;
- (void)useInMemoryStore;
- (void)addContext:(NSManagedObjectContext *)context identifier:(NSString *)identifier;
- (void)removeContextWithIdentifier:(NSString *)identifier;

- (BOOL)saveContext DEPRECATED_ATTRIBUTE;
- (BOOL)saveContext:(id)context;
- (void)save;

- (void)useInMemoryStore DEPRECATED_ATTRIBUTE;
- (void)setInMemoryStoreAsDefault;

#pragma mark - Helpers

Expand Down
102 changes: 79 additions & 23 deletions Classes/CoreDataManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,10 @@
#import "CoreDataManager.h"

@implementation CoreDataManager
@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
@synthesize managedObjectContexts = _managedObjectContexts;
@synthesize defaultManagedObjectContext = _defaultManagedObjectContext;
@synthesize defaultManagedObjectModel = _defaultManagedObjectModel;
@synthesize defaultPersistentStoreCoordinator = _defaultPersistentStoreCoordinator;
@synthesize databaseName = _databaseName;
@synthesize modelName = _modelName;

Expand Down Expand Up @@ -53,43 +54,98 @@ - (NSString *)modelName {

#pragma mark - Public

- (NSManagedObjectContext *)managedObjectContext {
if (_managedObjectContext) return _managedObjectContext;
- (NSManagedObjectContext *)defaultManagedObjectContext {
if (_defaultManagedObjectContext) return _defaultManagedObjectContext;

if (self.persistentStoreCoordinator) {
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_managedObjectContext setPersistentStoreCoordinator:self.persistentStoreCoordinator];
if (self.defaultPersistentStoreCoordinator) {
_defaultManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_defaultManagedObjectContext setPersistentStoreCoordinator:self.defaultPersistentStoreCoordinator];
}
return _managedObjectContext;
return _defaultManagedObjectContext;
}

- (NSManagedObjectModel *)managedObjectModel {
if (_managedObjectModel) return _managedObjectModel;
- (NSManagedObjectModel *)defaultManagedObjectModel {
if (_defaultManagedObjectModel) return _defaultManagedObjectModel;

NSURL *modelURL = [[NSBundle bundleForClass:[self class]] URLForResource:[self modelName] withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return _managedObjectModel;
_defaultManagedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return _defaultManagedObjectModel;
}

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (_persistentStoreCoordinator) return _persistentStoreCoordinator;
- (NSPersistentStoreCoordinator *)defaultPersistentStoreCoordinator {
if (_defaultPersistentStoreCoordinator) return _defaultPersistentStoreCoordinator;

_persistentStoreCoordinator = [self persistentStoreCoordinatorWithStoreType:NSSQLiteStoreType
storeURL:[self sqliteStoreURL]];
return _persistentStoreCoordinator;
_defaultPersistentStoreCoordinator = [self persistentStoreCoordinatorWithStoreType:NSSQLiteStoreType
storeURL:[self sqliteStoreURL]];
return _defaultPersistentStoreCoordinator;
}

- (void)useInMemoryStore {
_persistentStoreCoordinator = [self persistentStoreCoordinatorWithStoreType:NSInMemoryStoreType storeURL:nil];
[self setInMemoryStoreAsDefault];
}

- (void)setInMemoryStoreAsDefault
{
_defaultPersistentStoreCoordinator = [self persistentStoreCoordinatorWithStoreType:NSInMemoryStoreType storeURL:nil];
}

- (NSDictionary *)managedObjectContexts
{
if (_managedObjectContexts == nil) _managedObjectContexts = [NSDictionary dictionaryWithObject:self.defaultManagedObjectContext forKey:@"default"];
return _managedObjectContexts;
}

- (void)addContext:(NSManagedObjectContext *)context identifier:(NSString *)identifier
{
NSMutableDictionary* contexts = [NSMutableDictionary dictionaryWithDictionary:self.managedObjectContexts];
[contexts setObject:context forKey:identifier];
_managedObjectContexts = contexts;
}

- (void)removeContextWithIdentifier:(NSString *)identifier
{
NSMutableDictionary* contexts = [NSMutableDictionary dictionaryWithDictionary:self.managedObjectContexts];
[contexts setObject:nil forKey:identifier];
_managedObjectContexts = contexts;
}

- (void)save
{
for (NSString* identifier in [self.managedObjectContexts allKeys]) {
[self saveContext:identifier];
}
}

- (BOOL)saveContext:(id)context
{

if (context == nil) return NO;

NSManagedObjectContext* objectContext;
if ([context isKindOfClass:[NSString class]]) {
objectContext = self.managedObjectContexts[context];
if (objectContext == nil) return NO;
} else if ([context isKindOfClass:[NSManagedObjectContext class]]) objectContext = context;

if (![objectContext hasChanges])return NO;

NSError *error = nil;

if (![objectContext save:&error]) {
NSLog(@"Unresolved error in saving context! %@, %@", error, [error userInfo]);
return NO;
}

return YES;
}

- (BOOL)saveContext {
if (self.managedObjectContext == nil) return NO;
if (![self.managedObjectContext hasChanges])return NO;
if (self.defaultManagedObjectContext == nil) return NO;
if (![self.defaultManagedObjectContext hasChanges])return NO;

NSError *error = nil;

if (![self.managedObjectContext save:&error]) {
if (![self.defaultManagedObjectContext save:&error]) {
NSLog(@"Unresolved error in saving context! %@, %@", error, [error userInfo]);
return NO;
}
Expand Down Expand Up @@ -117,7 +173,7 @@ - (NSURL *)applicationSupportDirectory {
- (NSPersistentStoreCoordinator *)persistentStoreCoordinatorWithStoreType:(NSString *const)storeType
storeURL:(NSURL *)storeURL {

NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self defaultManagedObjectModel]];

NSDictionary *options = @{ NSMigratePersistentStoresAutomaticallyOption: @YES,
NSInferMappingModelAutomaticallyOption: @YES };
Expand Down
34 changes: 19 additions & 15 deletions Classes/NSManagedObject+ActiveRecord.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

@interface NSManagedObjectContext (ActiveRecord)
+ (NSManagedObjectContext *)defaultContext;
+ (NSDictionary *)allContexts;
@end

@interface NSManagedObject (ActiveRecord)
Expand Down Expand Up @@ -41,21 +42,24 @@

#pragma mark - Custom Context

+ (id)createInContext:(NSManagedObjectContext *)context;
+ (id)create:(NSDictionary *)attributes inContext:(NSManagedObjectContext *)context;

+ (void)deleteAllInContext:(NSManagedObjectContext *)context;

+ (NSArray *)allInContext:(NSManagedObjectContext *)context;
+ (NSArray *)allInContext:(NSManagedObjectContext *)context order:(id)order;
+ (NSArray *)where:(id)condition inContext:(NSManagedObjectContext *)context;
+ (NSArray *)where:(id)condition inContext:(NSManagedObjectContext *)context order:(id)order;
+ (NSArray *)where:(id)condition inContext:(NSManagedObjectContext *)context limit:(NSNumber *)limit;
+ (NSArray *)where:(id)condition inContext:(NSManagedObjectContext *)context order:(id)order limit:(NSNumber *)limit;
+ (instancetype)findOrCreate:(NSDictionary *)properties inContext:(NSManagedObjectContext *)context;
+ (instancetype)find:(NSDictionary *)attributes inContext:(NSManagedObjectContext *)context;
+ (NSUInteger)countInContext:(NSManagedObjectContext *)context;
+ (NSUInteger)countWhere:(id)condition inContext:(NSManagedObjectContext *)context;
+ (id)createInContext:(id)context;
+ (id)create:(NSDictionary *)attributes inContext:(id)context;

+ (void)deleteAllInContext:(id)context;

+ (NSArray *)allInContext:(id)context;
+ (NSArray *)allInContext:(id)context order:(id)order;
+ (NSArray *)where:(id)condition inContext:(id)context;
+ (NSArray *)where:(id)condition inContext:(id)context order:(id)order;
+ (NSArray *)where:(id)condition inContext:(id)context limit:(NSNumber *)limit;
+ (NSArray *)where:(id)condition inContext:(id)context order:(id)order limit:(NSNumber *)limit;
+ (instancetype)findOrCreate:(NSDictionary *)properties inContext:(id)context;
+ (instancetype)find:(NSDictionary *)attributes inContext:(id)context;
+ (NSUInteger)countInContext:(id)context;
+ (NSUInteger)countWhere:(id)condition inContext:(id)context;

- (void)moveToContext:(id)context;
- (void)copyToContext:(id)context;

#pragma mark - Naming

Expand Down
Loading