2011-09-28 48 views
1

我有一个核心数据模式,有一对多的关系,但我很努力想要获得值,例如CoreData一对多

Features.h模式是这样的:

@interface Features : NSManagedObject 

@property (nonatomic, retain) NSString * name; 
@property (nonatomic, retain) NSString * version; 
@property (nonatomic, retain) NSNumber * expires; 
@property (nonatomic, retain) NSNumber * used; 
@property (nonatomic, retain) NSNumber * licenses; 
@property (nonatomic, retain) NSManagedObject *featureToProducts; 
@property (nonatomic, retain) NSSet *featureToUsers; 
@property (nonatomic, retain) NSManagedObject *featureToDaemons; 
@end 

@interface Features (CoreDataGeneratedAccessors) 

- (void)addFeatureToUsersObject:(NSManagedObject *)value; 
- (void)removeFeatureToUsersObject:(NSManagedObject *)value; 
- (void)addFeatureToUsers:(NSSet *)values; 
- (void)removeFeatureToUsers:(NSSet *)values; 

@end 

,并试图访问它是这样的:

Features *feature = (Features *)[[self.sectionInfoArray objectAtIndex:indexPath.section] features]; 
NSLog(@"featureToUsers = %@", [feature.featureToUsers valueForKey:@"user"]); 

的NSLog显示:

2011-09-28 01:06 :59.719产品名称[74092:fb03] featureToUsers = {( “david.wilson”)}

我想填充的UITableViewCell,但我不断收到:

'NSInvalidArgumentException' 的,理由是: ' - [__ NSCFSet isEqualToString:]: 无法识别的选择发送到实例0x6b59a50'

谢谢, dfox

+0

那么你的问题是什么? –

+0

哦,对不起,我试图让[feature.featureToUsers valueForKey:@“user”]作为字符串。例如“david.wilson”,但我不断收到: 'NSInvalidArgumentException',原因:' - [__ NSCFSet isEqualToString:]:无法识别的选择器发送到实例0x6b59a50' – dfox

回答

2

退一步,深吸一口气,看。你有这样的声明:

@property (nonatomic, retain) NSSet *featureToUsers; 

,你会得到的诊断是__NSCFSet不理解isEqualToString:消息。 NSSet应该能够响应isEqualToString:消息的印象是从哪里得来的?它没有,它告诉你。 isEqualToString:是一个NSString消息。你不会说,但我想,你想从你的模型中得到一些字符串,并且用它做一些事情。哪个字符串?你不会说,但我想你已经声明这个关系指向另一个名为Users的实体。你不会说,但我猜(作为一个例外,你应该写出更好的问题,通过包括相关的上下文)Users实体具有某种类型的字符串属性,或许是name左右。

所以,如果你想要的字符串,你需要从Users实例拔不出来,也许是这样的:

Users *myUSer = ...; // see below 
NSString *myUserName = myUser.name; 
if ([myUserName isEqualToString:@"Superman"]) { ... } 

所以关键点1:核心数据,您可以操纵实体的实例,而不是字符串。但实体属性可以是字符串。

那么你打算如何让你Users实例?如果你写:

Users *myUSer = feature.featureToUsers.name; 

这将不能工作。因为featureToUsers被声明为NSSet,而不是Users

那么为什么这个属性,它实现了一对多的关系,声明为NSSet?因为它是一个多对多的关系,因此您需要将它作为集合键入,以便覆盖所有相关的对象。

因此,关键点#2:一对多关系被声明为集合(即NSSet)。

那么这个系列里面有什么?那么,你想要达到的Users。因此,您可以遍历每个相关用户,例如:

for (Users *aRelatedUser in feature.featureToUsers) { 
    NSString *relatedUserName = aRelatedUser.name; 
    if ([relatedUserName isEqualToString:@"Superman"]) { ... } 
} 

现在你应该很好走。