CoreData One-To-Many

时间:2011-09-28 06:12:13

标签: cocoa core-data uitableview

我有一个具有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

1 个答案:

答案 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"]) { ... }
}

现在你应该好好去。