CoreData一对多
我有一个核心数据模式,有一对多的关系,但我很努力想要获得值,例如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
退一步,深吸一口气,看。你有这样的声明:
@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"]) { ... }
}
现在你应该很好走。
那么你的问题是什么? –
哦,对不起,我试图让[feature.featureToUsers valueForKey:@“user”]作为字符串。例如“david.wilson”,但我不断收到: 'NSInvalidArgumentException',原因:' - [__ NSCFSet isEqualToString:]:无法识别的选择器发送到实例0x6b59a50' – dfox