Как получить объект, значение bool которого равно YES, из вложенных наборов объектов с помощью CoreData

#ios #objective-c #core-data

#iOS #objective-c #core-data

Вопрос:

У меня есть три модели ниже:

Show.h

 @class Season;

@interface Show : NSManagedObject

@property (nonatomic, retain) NSString * title;
@property (nonatomic, retain) NSSet *seasons;

@end
 

Season.h

 @class Episode, Show;

@interface Season : NSManagedObject

@property (nonatomic, retain) NSNumber * season;
@property (nonatomic, retain) NSSet *episodes;
@property (nonatomic, retain) Show *Show;

@end
 

Episode.h

 @class Season;

@interface Episode : NSManagedObject

@property (nonatomic, retain) NSNumber * watched;
@property (nonatomic, retain) Season *season;

@end
 

Отношения таковы: шоу имеет много сезонов, а сезон имеет много эпизодов, а эпизод имеет наблюдаемое значение bool. Прямо сейчас я хочу получить следующий эпизод, значение которого для просмотра равно NO, из его показа. Как написать этот предикат?

Ответ №1:

Ваши эпизоды неупорядочены, добавьте number свойство в Episode объект.

Обновлен ответ. По сути, вы добавляете дескрипторы сортировки, чтобы значения возвращались season свойством season, которое, как я полагаю, является его номером, и новым Eposode свойством, вызываемым number

 - (Episode *)nextUnwatchedEpisodeForShow:(Show *)show
{
  NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([Episode class])];
  fetchRequest.predicate = [NSPredicate predicateWithFormat:@"season.Show == %@ amp;amp; watched == %@", show, @NO];
  fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"season.season" ascending:YES], [NSSortDescriptor sortDescriptorWithKey:@"number" ascending:YES]];
  return [[self.managedObjectContext executeFetchRequest:fetchRequest error:nil] firstObject]; // first object should be the first unwatched episode, if it's nil then all the episodes were watched
}
 

Комментарии:

1. Но я хочу получить эпизод одного конкретного шоу? Если дела идут так же, как у вас, я просматриваю все эпизоды шоу.

2. При таком подходе вы получаете один конкретный эпизод. Дескрипторы поиска настроены так, чтобы возвращать неотслеживаемые эпизоды с наименьшим number первым номером. По сути, вы получаете первый не просмотренный эпизод сезона, как было указано в вашем вопросе.

3. У шоу может быть много сезонов. Мне нужно получить первый эпизод без просмотра для шоу. Он проходит через первый сезон, затем второй и так далее, чтобы найти первый не просмотренный эпизод.

4. Спасибо за прекрасный ответ. Логику формата предикатов действительно трудно получить.