【问题标题】:CoreData One-To-ManyCoreData 一对多
【发布时间】:2011-09-28 06:12:13
【问题描述】:

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

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 = {( “大卫.威尔逊”)}

我正在尝试填充 UITableViewCell 但我不断收到:

'NSInvalidArgumentException',原因:'-[__NSCFSet isEqualToString:]: 无法识别的选择器发送到实例 0x6b59a50'

谢谢, 狐狸

【问题讨论】:

  • 抱歉,我正在尝试将 [feature.featureToUsers valueForKey:@"user"] 作为字符串。例如“david.wilson”,但我不断收到:'NSInvalidArgumentException',原因:'-[__NSCFSet isEqualToString:]: unrecognized selector sent to instance 0x6b59a50'

标签: cocoa core-data uitableview


【解决方案1】:

退后一步,深呼吸,看看。你有这个声明:

@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)。

那么这个集合里面有什么?好吧,您想联系的Users。因此,您可以遍历每个相关用户,例如:

for (Users *aRelatedUser in feature.featureToUsers) {
    NSString *relatedUserName = aRelatedUser.name;
    if ([relatedUserName isEqualToString:@"Superman"]) { ... }
}

现在你应该很高兴了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    相关资源
    最近更新 更多