2010-03-26 3 views
10

Итак, скажем, у меня есть родительский родительский родитель, а родительский имеет отношение ко многим к детям (parent.children), и все они имеют имена. Теперь, при первоначальной выборке для родителей, я могу указать дескриптор сортировки, чтобы вернуть его в порядке имени, но как я могу запросить детей по порядку? Если я делаю [parent.children allObjects], он просто возвращает их в беспорядке, и мне придется сортировать после факта каждый раз.Основные данные, сортирующие дочерние объекты «один ко многим»

Спасибо, Сэм

ответ

11

Сэм,

Если я читаю ваш вопрос правильно, вы хотите, чтобы настроить выборку, которая возвращает отсортированный список детей конкретного родителя. Чтобы сделать это, я бы настроить выборку для «детей» лиц, а затем использовать предикат, чтобы ограничить результаты:

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; 
[request setEntity:[NSEntityDescription entityForName:@"children" inManagedObjectContext:moc]]; 
[request setSortDescriptors:[NSArray initWithObject:[[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES]]; 
[request setPredicate:[NSPredicate predicateWithFormat:@"(parent == %@)", parent]]; 

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

+0

Я вижу, ты предлагаешь работает выборки вместо того, чтобы просто используя ошибку в CoreData? Это менее результативно? т. е. настраивает выборку с предикатом и выполняет ее более дорого, чем просто выполнение [parent.children allObjects], и позволяет управляемому объекту заполнить ошибку? – Shizam

+0

Я думаю, что вы правы, что запуск всего нового запроса выборки будет медленнее, чем заполнение ошибки с помощью [parent.children allObjects], а затем сортировка NSArray, которую вы получаете. На мой взгляд, преимущество нового запроса выборки состоит в том, что вы можете использовать NSFetchedResultsController, чтобы обновлять и сортировать результирующий набор (т. Е. Если вы создадите новый дочерний элемент родителя, он автоматически вставляет его в список результатов) , Если вы планируете хранить список детей в течение какого-то времени, и список может измениться (т. Е. Вы показываете редактируемый список), я бы использовал эту стратегию. –

16

Если вы просто хотите использовать NSArray, а не NSFetchedResultsController, есть еще один способ:

NSSortDescriptor *alphaSort = [NSSortDescriptor sortDescriptorWithKey:@"firstName" ascending:YES]; 
NSArray *children = [[parent.children allObjects] sortedArrayUsingDescriptors:[NSArray arrayWithObject:alphaSort]]; 
+0

Shosti - вызов «allObjects» для отношения «многие» гарантирует, что все объекты в этом отношении будут повреждены и теперь в памяти, если не ранее? Иногда родительский объект извлекается без необходимости получать отношения, а затем мы хотим, чтобы все дочерние объекты (объекты, связанные с возможностью) присутствовали. Я задаюсь вопросом, гарантировано ли всегда, чтобы все ошибки были устранены в этих конкретных отношениях. – idStar

Смежные вопросы