Сортировать запрос выборки по отношению ко многим (основные данные)?

#ios #core-data #nspredicate #nssortdescriptor

#iOS #основные данные #nspredicate #nssortdescriptor

Вопрос:

Здесь вы можете увидеть взаимосвязь между элементом и переводом.

введите описание изображения здесь

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

Спасибо

Ответ №1:

Редактировать

Все, что вам нужно сделать, это получить все переводы элементов с помощью дескриптора сортировки

Я использую функцию, которую написал в прошлом:

   (NSArray*)fetchForEntity:(NSString*)entityName withPredicate:(NSPredicate*)predicate withSortDiscriptor:(NSString*)sortdDscriptorName{

NSManagedObjectContext *moc=[[[UIApplication sharedApplication] delegate]managedObjectContext];
NSEntityDescription *entityDescription;

NSFetchRequest *request = [[NSFetchRequest alloc] init];
entityDescription = [NSEntityDescription entityForName:entityName inManagedObjectContext:moc];
[request setEntity:entityDescription];

[request setPredicate:predicate];

if (sortdDscriptorName) {
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]
                                        initWithKey:sortdDscriptorName ascending:YES];
    [request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
}

NSError *error = nil;
NSArray * requestArray =[moc executeFetchRequest:request error:amp;error];
if (requestArray == nil)
{
    // Deal with error...
}
return requestArray;

   }
  

В вашем случае вы должны использовать call it таким образом:

  NSString *languageName = @"German"; //or what ever
 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"language ==   %@",languageName];

 NSArray *array = [self fetchForEntity:@"Translation" withPredicate:predicate withSortDiscriptor:@"name"];
  

Теперь у вас есть список всех переводов на немецком языке.
Затем вы можете получить все необходимые элементы с помощью:

   NSMutableArray *itemsArray = [NSMutableArray array];
 [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
   Translation *translation = (Translation*)obj;
   Item *item = translation.item;
  [itemsArray addObject:item];
 }];
  

Надеюсь, это поможет
Шани

Комментарии:

1. Спасибо за быстрый ответ, но это не работает. Я получаю эту ошибку: Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'to-many key not allowed here' . Это из-за отношения translations (ко многим).

2. Я также забыл сказать, что я хочу отсортировать по translations.name . В своем ответе вы написали переводы. язык, но это не должно иметь большого значения.

3. Отредактировал мой ответ. Я надеюсь, что теперь это будет соответствовать вашим потребностям

4. Спасибо за вашу помощь, это сработало. Подумал, что это можно было бы решить проще без повторения какого-либо перевода.