无法在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隐含地假设在NSManagedObject
build模为数组或集合的多对多关系映射到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
如果无法获得一个可变的代理。 这应该够了吧。