cocoa - CoreData 一对多

标签 cocoa core-data uitableview

我有一个具有一对多关系的核心数据模式,但我正在努力获取值,例如

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/

相关文章:

objective-c - 如何将变量传递给我在使用 @selector(methodname) 时调用的新方法

objective-c - NSOutlineView拖放问题

ios - 仅从远程CloudKit数据库收到更改时如何通知?

ios - 让 UITableViewCell 显示没有红色减号的删除按钮

cocoa - 如何用Cocoa压缩jpeg图像?

macos - 如何防止设置不是由我的代码设置的 [NSApp dockTile] badLabel 值?

swift - 我获取的结果 Controller 未在旧条目中对新条目进行排序

ios - NSFetchedResultsController 不获取子父 moc 链?

ios - 解析YouTube JSON以获取UITableView

ios - 拉动时 UIRefreshControl 中的奇怪动画