无法在RestKit中映射NSManagedObject的对象数组

我有NSManagedObject子类的User类:

 @interface User : NSManagedObject @property (nonatomic, retain) NSString * about; @property (nonatomic, retain) NSString * contactAddress; @property (nonatomic, retain) NSString * contactEmail; @property (nonatomic, retain) NSString * hobbies; @property (nonatomic, retain) NSArray* jobExperience; @property (nonatomic, retain) NSString * name; @property (nonatomic, retain) NSString * surname; @end 

正如你所看到的,这个对象具有JobExperience对象的NSArray属性。 JobExperience定义如下:

 @interface JobExperience : NSObject <NSCoding> @property (nonatomic,strong) NSString* position; @property (nonatomic,strong) NSString* organization; @property (nonatomic,strong) NSString* dateFrom; @property (nonatomic,strong) NSString* dateTo; @property (nonatomic,strong) NSString* website; @property (nonatomic,strong) NSString* location; @property (nonatomic,strong) NSString* jobDescription; @end 

在数据模型中,我有一个实体User ,其中jobExperience属性定义为可transformable 。 这就是为什么我在其中实现NSCoding方法。 这是我的User映射:

  _sharedUserProfileMapping = [RKObjectMapping mappingForClass:[User class]]; [_sharedUserProfileMapping addAttributeMappingsFromArray:@[ @"name", @"surname", @"hobbies", @"interests", @"contact_address", @"contact_email" ]]; RKObjectMapping* mappingForJobExperience = [RKObjectMapping mappingForClass:[JobExperience class]]; [mappingForJobExperience addAttributeMappingsFromArray:@[ @"location", @"website", @"organization" , @"position" , @"date_from", @"date_to" ]]; [mappingForJobExperience addAttributeMappingsFromDictionary:@{@"description": @"jobDescription"}]; [_sharedUserProfileMapping addRelationshipMappingWithSourceKeyPath:@"job_experience" mapping:mappingForJobExperience]; 

正如你所看到的,我添加了关系映射。 当User只是一个NSObject子类完全映射! 但是,当我把它NSManagedObject子类我有一个exception:

NSManagedObject映射一对多的关系。 关于通过mutable应用值[Set | Array] ValueForKey restkit.object_mapping:RKMappingOperation.m:726将keyArray“job_experience”映射为NSArray关系对象为“jobExperience”。 值:(“”,“”) *由于未捕获exception'NSInvalidArgumentException',原因:'NSManagedObjects of entity'User'不支持-mutableArrayValueForKey:属性'jobExperience''*第一次抛出调用堆栈:

而只是为了澄清其他属性映射完美。 只有这个JobExperience对象的数组的问题。

你可能会陷入这里没有实现的领域。 具有一系列托pipe对象的外部对象可以工作(IIRC),但是从描述和外部托pipe对象以及对象数组不起作用。 这并没有帮助,你实际上没有显示不同的映射,做和不工作,但…

RestKit应该对目标数据types进行自省以决定要做什么。 也许这不适用于这种情况,因为它提供了一个关系规范,它可能会假定目标是一个核心数据关系。

在任何情况下,拥有一个自定义对象数组的pipe理对象是不寻常的。 通常你会使用2个pipe理对象和实体之间的关系。 这更有意义,并在运行时提供更多的performance力和效率。 这是我的build议。

这可能是你需要设置mappingForJobExperience.forceCollectionMapping = YES; 使其工作(猜测)。

RestKit隐含地假设在NSManagedObjectbuild模为数组或集合的多对多关系映射到CoreData实体。 一个解决scheme是以前的答案build议:build模您的数组属性作为一个单独的实体。 如果这对devise不切实际,而且您确实想将该属性保留为Transformable,则可以覆盖mutableArrayValueForKey 。 这可能是适合您的初始示例的可能实现:

 - (NSMutableArray *) mutableArrayValueForKey:(NSString *)key { if ( [key isEqualToString: @"jobExperience"] ) { NSMutableArray * mutableJobExperience = [NSMutableArray array]; if ( self.jobExperience != nil ) { mutableJobExperience.array = self.jobExperience; } self.jobExperience = mutableJobExperience; return mutableJobExperience; } else { return [super mutableArrayValueForKey: key]; } } 

这个简单的实现的缺点是我们正在将jobExperience变成一个可变的数组。 在完成了结果映射后,可能会在代码的稍后阶段修复这个问题。

另一个解决scheme是在这种情况下补丁RestKit行为不同。 我build议修改方法- (BOOL)mapCoreDataToManyRelationshipValue:(id)valueForRelationship withMapping:(RKRelationshipMapping *)relationshipMapping RKMappingOperation返回NO如果无法获得一个可变的代理。 这应该够了吧。