2013-02-27 3 views
0

J'ai deux entités "à plusieurs" relationA propos de "to-many" et prédicat

enter image description here

Maintenant, je veux aller chercher toutes les catégories qui a seulement favoris (isFavorite) Recettes.

Cela ressemble à:

SELECT c.* 
FROM zcategories c, zrecipes r 
where 
    r.zisfavorite = 1 
    and r.zincategory = c.z_pk 
group by c.zname; 

J'ai essayé

- (NSFetchedResultsController *)fetchedResultsController 
{ 
    if (__fetchedResultsController != nil) { 
     return __fetchedResultsController; 
    } 

    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
    self.checkedMOC = appDelegate.managedObjectContext; 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    // Edit the entity name as appropriate. 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Categories" inManagedObjectContext:self.checkedMOC]; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ALL recipes.isFavorite == %@", [NSNumber numberWithInt:1]]; 
    [fetchRequest setEntity:entity]; 
    [fetchRequest setPredicate:predicate]; 

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

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

    [fetchRequest setSortDescriptors:sortDescriptors]; 

    // Edit the section name key path and cache name if appropriate. 
    // nil for section name key path means "no sections". 
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.checkedMOC sectionNameKeyPath:nil cacheName:@"Master"]; 
    aFetchedResultsController.delegate = self; 
    self.fetchedResultsController = aFetchedResultsController; 

    NSError *error = nil; 
    if (![self.fetchedResultsController performFetch:&error]) { 
     // Replace this implementation with code to handle the error appropriately. 
     // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 

    return __fetchedResultsController; 
} 

mais l'erreur se produit 'à plusieurs clés pas autorisés ici'

+0

Qu'avez-vous essayé? – bbarnhart

+0

dans l'entité Recettes il y a un attribut ** isFavorite ** voir ma mise à jour – Romowski

+0

Quel est le nom de l'entité pour votre NSFetchRequest? Catégories ou Recettes? – bbarnhart

Répondre

1

Si vous voulez que les instances de catégorie que avoir une ou plusieurs recettes qui sont des favoris, essayez le ANY mot-clé

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY recipes.isFavorite == %@", [NSNumber numberWithInt:1]]; 

Si vous voulez que les instances de catégorie qui ont seulement des recettes qui sont les favoris, vous pouvez utiliser le mot-clé ALL:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ALL recipes.isFavorite == %@", [NSNumber numberWithInt:1]]; 
+0

Erreurs: 1. ** Le cache persistant des informations de section ne correspond pas à la configuration actuelle. Vous avez muté illégalement la requête d'extraction de NSFetchedResultsController, son prédicat ou son descripteur de tri sans désactiver la mise en cache ou en utilisant + deleteCacheWithName: '** 2. **' Prédicat non pris en charge (null) '** – Romowski

+0

Vous devriez publier plus de votre code, pas seulement la ligne où vous avez créé NSPredicate. Il est probable que vos problèmes proviennent de quelque chose d'autre que la création du prédicat. –

+0

Il peut également y avoir un problème avec l'utilisation de ALL directement sur un magasin de persistance SQLite que vous devez contourner. La documentation et la réalité ne semblent pas correspondre ici. Voir les réponses à http://stackoverflow.com/questions/5922139/crash-using-aggregate-operation-all-in-a-core-data-ios-application pour plus d'informations –