Учитывая следующий надуманный пример:
Я хотел бы запросить мои данные для всех объектов, которые являются кошками или собаками. Я хочу, чтобы результирующий набор был упорядочен по имени независимо от вида, поэтому выборка всех кошек, а затем всех собак не подойдет. Я хочу сделать это в одном запросе.
Один из способов сделать это - добавить поле petType в Pet, присвоить каждой записи значение petType, которое идентифицирует подобъект, которому она принадлежит, а затем запросить примерно так:
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Pet"
inManagedObjectContext:myMOC];
[fetchRequest setEntity:entity];
// petType values: 1 = dog, 2 = cat, 3 = goldfish. Yuk.
NSPredicate *p = [NSPredicate predicateWithFormat:@"petType = 1 OR petType = 2"]
[fetchRequest setPredicate:p];
// etc...
. Но одна мысль о том, чтобы сделать это таким образом, заставляет меня содрогаться. Есть ли способ лучше?
Обновление : Спасибо всем, кто ответил - здесь есть несколько действительно хороших, хорошо продуманных решений, и я ценю их все.
Чтобы дать этому некоторый контекст , реальная модель данных немного сложнее этой (не всегда), но она довольно хорошо организована. В свое время я разработал более чем изрядную долю схем данных, и я рад, что сущности и их отношения хорошо продуманы. Эта проблема возникла потому, что (чтобы расширить и без того шаткий надуманный пример) клиент изначально хотел:
Пока все хорошо. Но им также нужно представление, показывающее объединенный список всех кошек и собак, «потому что маленькие девочки любят кошек и собак». (Первоначально по той же причине это были кошки и золотые рыбки.) На самом деле нет способа естественным образом сгруппировать это подмножество конкретных объектов; это действительно довольно произвольно.
Пока что подход Дэйва Дрибина к «абстрактной промежуточной сущности» кажется самым чистым решением, хотя в моем случае я думаю, что он выглядел бы несколько искусственным; на самом деле единственный способ правдиво обозначить промежуточную сущность - это «ThingLittleGirlsLike»! :)