我有一个具有1对多关系的核心数据模式,但我很难得到这个值。
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 :(得分:2)
退后一步,深吸一口气,看看。你有这个声明:
@property (nonatomic, retain) NSSet *featureToUsers;
您获得的诊断是__NSCFSet
无法理解isEqualToString:
消息。您认为NSSet
应该能够回复isEqualToString:
消息的印象在哪里?它不会,它告诉你。 isEqualToString:
是NSString
消息。你没有说,但我想,你想从你的模型中获取一些字符串,并用它做一些事情。哪个字符串?你没有说,但我猜你已经宣布这个关系指向另一个名为Users
的实体。你没有说,但我猜(顺便说一句,你应该通过包含相关的上下文来编写更好的问题)Users
实体有某种字符串属性,可能是name
左右。 / p>
因此,如果你想要那个字符串,你需要从Users
实例中取出它,也许是这样的:
Users *myUSer = ...; // see below
NSString *myUserName = myUser.name;
if ([myUserName isEqualToString:@"Superman"]) { ... }
所以关键点#1:核心数据允许你操纵实体的实例,而不是字符串。但实体属性可以是字符串。
那么你如何得到Users
实例?如果你写:
Users *myUSer = feature.featureToUsers.name;
这也不起作用。因为featureToUsers被声明为NSSet
,而不是Users
。
那么为什么这个实现to-many关系的属性被声明为NSSet?因为它是一个多对多关系,因此,您需要将其键入为集合,以便到达所有相关对象。
关键点#2:多对多关系被声明为一个集合(即NSSet
)。
那么这个系列里面有什么?好吧,你想要达到的Users
。因此,您可以遍历每个相关用户,例如:
for (Users *aRelatedUser in feature.featureToUsers) {
NSString *relatedUserName = aRelatedUser.name;
if ([relatedUserName isEqualToString:@"Superman"]) { ... }
}
现在你应该好好去。