2011-09-28 55 views
1

我有一個核心數據模式,有一對多的關係,但我很努力想要獲得值,例如CoreData一對多

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

那麼你的問題是什麼? –

+0

哦,對不起,我試圖讓[feature.featureToUsers valueForKey:@「user」]作爲字符串。例如「david.wilson」,但我不斷收到: 'NSInvalidArgumentException',原因:' - [__ NSCFSet isEqualToString:]:無法識別的選擇器發送到實例0x6b59a50' – dfox

回答

2

退一步,深吸一口氣,看。你有這樣的聲明:

@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:核心數據,您可以操縱實體的實例,而不是字符串。但實體屬性可以是字符串。

那麼你打算如何讓你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"]) { ... } 
} 

現在你應該很好走。