我有一个具有一对多关系的核心数据模式,但我正在努力获取值,例如
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 Product Name[74092:fb03] featureToUsers = {( "david.wilson" )}
我正在尝试填充 UITableViewCell 但我不断收到:
'NSInvalidArgumentException', reason: '-[__NSCFSet isEqualToString:]: unrecognized selector sent to instance 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:Core Data 允许您操作实体的实例,而不是字符串。但实体属性可以是字符串。
那么您将如何获取 Users
实例?如果你写:
Users *myUSer = feature.featureToUsers.name;
这也行不通。因为 featureToUsers 被声明为 NSSet
,而不是 Users
。
那么为什么这个实现了一对多关系的属性被声明为 NSSet 呢?因为它是一对多关系,因此,您需要将其类型化为集合,以便访问所有相关对象。
所以关键点#2:一对多关系被声明为集合(即 NSSet
)。
那么这个集合里面有什么?好吧,就是您想要覆盖的用户
。因此,您可以迭代每个相关用户,例如:
for (Users *aRelatedUser in feature.featureToUsers) {
NSString *relatedUserName = aRelatedUser.name;
if ([relatedUserName isEqualToString:@"Superman"]) { ... }
}
现在您应该可以开始了。
关于cocoa - CoreData 一对多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7579036/