2010-03-16 8 views
3

ceci est mon modèle de données de base:iPhone CoreData joindre

enter image description here

J'essaie d'obtenir tous LanguageEntries à partir d'une base de données pour une category.categoryName et languageset.languageSetName par exemple donné

NSFetchRequest* fetchRequest = [[NSFetchRequest alloc] init]; 

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"LanguageEntry" inManagedObjectContext:del.managedObjectContext]; 
    [fetchRequest setEntity:entity]; 

NSString* predicateString = [NSString stringWithFormat:@"Category.categoryName = %@ AND LanguageSet.languageSetName = %@", 
         @"Food", @"English####Spanish"]; 

fetchRequest.predicate = [NSPredicate predicateWithFormat:predicateString]; 

NSError *error = nil; 
NSArray* objects = [del.managedObjectContext executeFetchRequest:fetchRequest error:&error]; 

Ceci retourne toujours 0 objets. Si je mets la chaîne de prédicat à correspondre sur une relation (par exemple, Category.categoryName = Food ou languageSet.languageSetName = English #### Spanish), elle renvoie des données.

Ceci est déconcertant, quelqu'un peut-il faire la lumière?

-> Ken

Répondre

9

Votre ne peut pas penser que Core Data SQL. Il n'y a pas de «jointure» dans les données de base. Dans ce cas, vous essayez de trouver l'intersection de deux ensembles d'objets. Fermer à une jointure logiquement mais pas dans les détails d'implémentation. Et le diable de la programmation est toujours dans les détails.

Essayez d'utiliser la même logique « == » comme ceci:

@"Category.categoryName == %@ AND LanguageSet.languageSetName == %@" 

Je pense que cela va résoudre votre problème.

Le modèle de données comporte un éditeur de prédicat caché. Il peut vous aider à configurer des prédicats même si vous ne les intégrez pas dans des extractions dans le modèle lui-même. Sélectionnez simplement une entité, dans votre cas "LanguageEntity", puis ajoutez une Fetch Request. Le prédicat d'édition apparaît et vous pouvez utiliser la boîte de dialogue pour créer le prédicat. Il affichera une version textuelle du prédicat que vous pouvez copier dans votre code.

+0

Pour l'éditeur de prédicat (dans ce cas) devrais-je sélectionner "LanguageEntry" comme destination? – Ken

+1

Désolé, j'aurais dû dire "ajouter une requête de recherche". Cela vous permet de construire n'importe quel prédicat que vous voulez. Vous pouvez également enregistrer la requête d'extraction dans le modèle lui-même afin de ne pas avoir à le créer manuellement. Cela perd cependant son avantage quand vous devez utiliser des variables. – TechZen

+0

single = est très bien à utiliser dans un prédicat, ce n'est pas le problème ici. – malhal

1

Le prédicat correctement n'a pas été créé correctement, vous devez transmettre les paramètres à predicateWithFormat. Il aurait dû être:

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"Category.categoryName = %@ AND LanguageSet.languageSetName = %@", 
                  @"Food", 
                  @"English####Spanish"]; 

Dans le cas où vous vous demandez ce que lorsque vous utilisez une chaîne dans un prédicat fait est qu'il met entre guillemets les paramètres de chaîne automatiquement qui sont nécessaires. Lorsque vous avez créé la requête en utilisant la méthode de format de NSString qui n'a pas mis les citations requises po.

Questions connexes