1

У меня проблемы с выборкой объектов от одного до многих отношений. У меня есть два объекта «Featured» и «Event», признанный объект содержит свойство featuredEvents, это отношение One-Many, один «Featured» для многих «событий».Отношения во многих отношениях с NSfetchedresultscontroller

Теперь мне нужно использовать NSFetchedResultsController, чтобы возвращать события, включенные в отношения «featuredEvents». Я использую следующий код:

NSFetchedResultsController *fetchedFeaturedEvents; 
    NSFetchRequest *fetchRequest; 
    NSError *error = nil; 

    fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"SDMFeaturedEvent"]; 
    [fetchRequest setSortDescriptors:@[]]; 

    fetchedFeaturedEvents = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:theManagedObjectContext sectionNameKeyPath:nil cacheName:nil]; 
    [fetchedFeaturedEvents performFetch:&error]; 

    if (error) { 
     NSLog(@"Unable to perform fetch."); 
     NSLog(@"%@, %@", error, error.localizedDescription); 
    } 

    return fetchedFeaturedEvents; 

Это здорово я вернуть признаки события, но я хотел бы также добавить предикат возвращает только событие в свойстве «featuredEvents». Итак, вопрос в том, как создать предикат?

Мне в основном нужны все «События» В свойстве featuredEvents объекта «Featured» im, делающего выборку, возможно ли это?

+0

Свойство featuredEvents уже предоставляет вам все события для Feature. Доступ к свойству автоматически приводит к сбою и сбоям в событиях - нет необходимости в запросе на Событие. Не уверен, понимаю ли я ваш вопрос. – jp2g

+0

Да, я могу получить к ним доступ таким образом, но можно ли получить доступ к ним через предикат, так как я бы хотел использовать другие предикатные методы для них? – SmokersCough

+0

Создайте предикат, который фильтрует обратную связь функции. Для синтаксиса проверьте любой из миллионов примеров и практических рекомендаций, доступных через Google. – Avi

ответ

0

Для тех, кто был с аналогичными проблемами, я в конце концов использовали этот подход:

NSFetchRequest *fetchRequest; 
    NSError *error = nil; 
    NSArray *fetchedObjects; 
    NSPredicate *soldOutPredicate; 
    NSPredicate *criteriaMatchPredicate; 
    NSCompoundPredicate *fullPredicate; 
    NSSortDescriptor *usesDescriptor = [[NSSortDescriptor alloc] initWithKey:@"eventDate" ascending:YES]; 

    fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"FeaturedEvent"]; 
    [fetchRequest setSortDescriptors:@[]]; 
    fetchedObjects = [theManagedObjectContext executeFetchRequest:fetchRequest error:&error]; 

    if (error) { 
     NSLog(@"Unable to perform fetch."); 
     NSLog(@"%@, %@", error, error.localizedDescription); 
    } 

    if ([[NSSDMUserDetails sharedManager]showsCriteraMatchEvents]) { 

     if ([[NSSDMUserDetails sharedManager]isUserMale]) { 
      criteriaMatchPredicate = [NSPredicate predicateWithFormat:@"(eventAgeMaleMin <= %@) AND (eventAgeMaleMax >= %@)",[[[NSSUserDetails sharedManager]userAge]stringValue],[[[NSUserDetails sharedManager]userAge]stringValue]]; 
     } 
     else{ 
      criteriaMatchPredicate = [NSPredicate predicateWithFormat:@"(eventAgeFemaleMin <= %@) AND (eventAgeFemaleMax >= %@)",[[[NSUserDetails sharedManager]userAge]stringValue],[[[NSUserDetails sharedManager]userAge]stringValue]]; 
     } 

     fullPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[criteriaMatchPredicate]]; 

    } 

    if (![[NSSDMUserDetails sharedManager]showsSoldOutEvents]) { 

     if ([[NSSDMUserDetails sharedManager]isUserMale]) { 
      soldOutPredicate = [NSPredicate predicateWithFormat:@"eventPlacesMale == %@ || eventPlacesMale != %@",@"in stock",@"0"]; 
     } 
     else{ 
      soldOutPredicate = [NSPredicate predicateWithFormat:@"eventPlacesFemale == %@ || eventPlacesFemale != %@",@"in stock",@"0"]; 
     } 

     fullPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[soldOutPredicate]]; 
    } 

    if (soldOutPredicate && criteriaMatchPredicate) { 

     fullPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[soldOutPredicate,criteriaMatchPredicate]]; 

    } 

    if (fetchedObjects && fetchedObjects.count > 0) { 

     SDMFeaturedEvent *feat = [fetchedObjects objectAtIndex:0]; 
     NSLog(@"All featured events %@",feat.featuredEvents); 
     if (fullPredicate) { 
      return [[feat.featuredEvents.allObjects filteredArrayUsingPredicate:fullPredicate]sortedArrayUsingDescriptors:@[usesDescriptor]]; 
     } 
     else if (![[NSSDMUserDetails sharedManager]showsCriteraMatchEvents]){ 
      return [feat.featuredEvents.allObjects sortedArrayUsingDescriptors:@[usesDescriptor]]; 
     } 
     else{ 
      return [NSArray new]; 
     } 

    } 
    return [NSArray new]; 

Хитрость в том, чтобы возвращать массив событий из featuredEvent «featuredEvents» собственности, то вы можете запустить filteredArrayUsingPredicate и sortedArrayUsingDescriptor методы для сортировки объектов события в массиве с любыми вашими требованиями. Конечно, это не возвращает NSFetchedResultsController, но это отлично подходит для фильтрации.