Основные данные: Абстрактная сущность в запросе на выборку - PullRequest
31 голосов
/ 13 июня 2011

Предположим, у меня есть модель Core Data с сущностью abstract под названием "Животное". Затем у меня есть много других сущностей, которые наследуются от этой абстрактной сущности: «Лев», «Собака», «Кошка» и т. Д. (Я не занимаюсь разработкой программы для зоопарка, но эта аналогия хорошо работает для проблемы, которую я объясняю !)

То, что я хочу знать: могу ли я получить «всех животных» одновременно, выполнив следующее:

NSFetchRequest *searchRequest = [[NSFetchRequest alloc] init];
[searchRequest setEntity:[NSEntityDescription entityForName:@"Animal" inManagedObjectContext:aContext]];

NSArray *matchedObjects = [aContext executeFetchRequest:searchRequest error:nil];

Я понимаю, что в NSEntityDescription есть методы для определения того, наследует ли объект от другого. Но есть ли быстрый способ получить все объекты определенного (абстрактного) типа - в данном случае «Животное»?

Если вышеуказанный подход неверен, каков наиболее эффективный способ для этого? Спасибо!

Ответы [ 2 ]

32 голосов
/ 13 июня 2011

Вы можете определенно использовать этот подход.

Из руководства Apple по Core Data Programming :

Наследование сущностей работает аналогично наследованию классов;и полезно по тем же причинам.Если у вас есть несколько похожих сущностей, вы можете объединить общие свойства в суперспособность, также известную как родительская сущность.Вместо того, чтобы указывать одни и те же свойства в нескольких объектах, вы можете определить их в одном объекте, а дочерние объекты наследуют их.Например, вы можете определить сущность Person с атрибутами firstName и lastName и подразделами Employee и Customer, которые наследуют эти атрибуты.

2 голосов
/ 13 июня 2011

Я сделал нечто подобное, однако эта сущность не была абстрактной. Это была стандартная сущность (без экземпляров), и все остальные сущности, которые я выбрал, были получены из этой сущности. Я не пробовал это с абстрактным классом, однако, глядя на документы, кажется, что это может быть невозможно:

Руководство по программированию основных данных

Абстрактные объекты Вы можете указать, что сущность абстрактна, то есть вы не будете создавать экземпляры эта сущность. Вы обычно делаете абстрактный объект, если у вас есть номер сущностей, которые все представляют специализации (наследовать) от общая сущность, которая не должна сама быть воплощенным в жизнь. Например, в приложение для рисования вы могли бы иметь Графическая сущность, которая определяет атрибуты для координат х и у, цвета и рисование границ. Вы никогда, хотя, создать экземпляр графика. бетон Субъекты Графика могут быть Круг, TextArea и Линия.

Мое предложение состояло бы в том, чтобы настроить вещи с абстрактной сущностью Животного и дать ей шанс. Если это не сработает, просто сделайте сущность Животного неабстрактной (слова подводят меня, это то, что мы бы назвали? Возможно, «конкретный» лучше?), И у вас все будет хорошо. Если бы кто-то сделал это с абстрактным классом, я бы услышал об этом.

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