#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. Спасибо за прекрасный ответ. Логику формата предикатов действительно трудно получить.