NSFetchedResultsController и Entity Inheritance - PullRequest
4 голосов
/ 08 марта 2012

У меня есть родительский объект в моей модели Event. И две дочерние сущности: день рождения, юбилей. Я использую функцию наследования сущностей, встроенную в данные Core, так что родительским объектом для дня рождения и годовщины является Event.

Так что я делаю выборку, используя следующее:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];

// Set the batch size to a suitable number.
[fetchRequest setFetchBatchSize:20];

// Edit the sort key as appropriate.
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"start_date" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];

etc...

Теперь я хочу отсортировать выбранные объекты по типу события, дню рождения или годовщине.

Как мне это сделать? Я попробовал:

for (Birthday *birthday in _fetchedResultsController.fetchedObjects){
    [birthdayObjects addObject:birthday]; 
}
for (Anniversary *anniversary in _fetchedResultsController.fetchedObjects){
    [anniversaryObjects addObject:anniversary]; 
}

Но это просто добавляет все объекты в fetchedObjects к каждому массиву.

Есть идеи или я поступаю неправильно?

ОБНОВЛЕНИЕ :

Разобрался, используя это:

for (Event *event in _fetchedResultsController.fetchedObjects){
    if ([event isKindOfClass:[Birthday class]]){
        [birthdayObjects addObject:event]; 
    }else{
        [anniversary addObject:event];
    }
}

Но если есть лучший способ, я открыт для этого! Благодарю.

1 Ответ

0 голосов
/ 23 марта 2012

Имейте свойство только для чтения на Event, называемое eventType или аналогичное, которое возвращает строку. Ваш класс Event возвращает одну строку, а ваши дочерние события возвращают Birthday, Anniversary и все остальное для будущих типов событий.

В выбранном вами контроллере результатов, если вы его используете, вы можете установить eventType в качестве ключевого пути имени раздела, и это разделит типы на разделы для вас - временные свойства, подобные этому, подходят для этой цели, но вы не можете используйте их как часть запроса на выборку.

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

Если вам не нравится строка, вы можете использовать enum. Если вы хотите использовать тип события в запросе на выборку, сделайте его атрибутом класса Event и установите его соответствующим образом в awakeFromInsert.

...