Базовые данные родительского объекта - PullRequest
4 голосов
/ 08 декабря 2011

У меня есть абстрактная сущность A, у меня также есть две сущности, чьим родителем является сущность A. У каждого ребенка разные отношения с другими сущностями.

Я пытаюсь получить все дочерние объекты сущности А, чье логическое значение isPublic равно YES.

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

Итак, мы могли бы сказать, например, что: • Объект А является «Документом», • Сущность B - «Поэма», • Объект C - это «Статья»

Все стихи и статьи подкласса документа и документа имеют свойство isBookmarked, suer может пометить стихотворение или статью, и мне нужен способ извлечения всех документов, которые добавлены в закладки. Объекты B и C должны быть независимыми из-за других принадлежащих им отношений.

Я хочу использовать NSFetchedResultsController для оптимальной производительности Core Data и UITableView, и я изо всех сил пытаюсь получить набор стихов и статей.

Какой запрос на выборку даст мне смесь стихов и статей?

enter image description here

Ответы [ 2 ]

5 голосов
/ 09 декабря 2011

Ответ Винке должен сработать, если вы просто добавите

[request setIncludesSubentities:YES];

, в противном случае вы получите только результаты сущности A, которая должна быть не такой, как вы сказали, что она абстрактна.

4 голосов
/ 08 декабря 2011

Как насчет чего-то простого, подобного этому (которое предполагает, что isBookmarked является логическим значением):

NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Document" inManagedObjectContext:context];
// This may not be the most elegant way of using a boolean in a predicate, but…

NSNumber *numIsBookmarked = [NSNumber numberWithBool:YES];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"isBookmarked == %@", numIsBookmarked];
NSFetchRequest *request = [[NSFetchRequest alloc] init];

[request setEntity: entityDescription]; 
[request setPredicate: predicate]; 
[request setResultType: NSManagedObjectResultType];

NSError *error = nil; 
NSArray *results = [contextMain executeFetchRequest:request error:&error];

if (error) 
{
    // deal with the error
}

[request release];

После чего вы будете проверять, какой подкласс был выбран:

for (NSManagedObject *obj in results)
{ 
    if ([obj isKindOfClass:[Poem class]])
    {
        // do whatever
    }
    else if ([obj isKindOfClass:[Article class]])
    {
        // do whatever
    }
}

(В качестве альтернативы, если несколько из подклассовых МО реализуют один и тот же метод, может быть более эффективно выполнить respondsToSelector: тест.)

Это не работает?

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