CoreData один-ко-многим - PullRequest
       2

CoreData один-ко-многим

1 голос
/ 28 сентября 2011

У меня есть режим основных данных, который имеет отношение 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 = {("Дэвид.wilson ")}

Я пытаюсь заполнить UITableViewCell, но продолжаю получать:

'NSInvalidArgumentException', причина: '- [__ NSCFSet isEqualToString:]:нераспознанный селектор отправлен на экземпляр 0x6b59a50 '

Спасибо, dfox

1 Ответ

2 голосов
/ 28 сентября 2011

Сделай шаг назад, сделай глубокий вдох и посмотри. У вас есть это объявление:

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

А теперь тебе надо идти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...