diff --git a/Classes/NSManagedObject+Mappings.h b/Classes/NSManagedObject+Mappings.h index 7ac1641..28b9a9d 100644 --- a/Classes/NSManagedObject+Mappings.h +++ b/Classes/NSManagedObject+Mappings.h @@ -61,4 +61,11 @@ */ + (NSString *)primaryKey; +/** + Remote key for primaryKey. E.g., @c @@"remote_id". + + @return A remote key name or primaryKey if not overriden + */ ++ (NSString *)remotePrimaryKey; + @end diff --git a/Classes/NSManagedObject+Mappings.m b/Classes/NSManagedObject+Mappings.m index 52adc45..82e0df1 100644 --- a/Classes/NSManagedObject+Mappings.m +++ b/Classes/NSManagedObject+Mappings.m @@ -59,8 +59,17 @@ + (id)objectOrSetOfObjectsFromValue:(id)value ofClass:class inContext:(NSManaged if ([value isKindOfClass:class]) return value; - if ([value isKindOfClass:[NSDictionary class]]) - return [class findOrCreate:value inContext:context]; + if ([value isKindOfClass:[NSDictionary class]]) { + NSString *primaryValue = value[ [class remotePrimaryKey] ]; + + if (primaryValue) { + NSManagedObject *object = [class findOrCreate:@{ [class primaryKey]: primaryValue } inContext:context]; + [object update:value]; + return object; + } + + return [class findOrCreate:value inContext:context]; + } if ([value isKindOfClass:[NSArray class]]) return [NSSet setWithArray:[value map:^id(id object) { @@ -116,4 +125,8 @@ + (id)primaryKey { userInfo:nil]; } ++ (NSString *)remotePrimaryKey { + return [self primaryKey]; +} + @end