1

J'ai deux entités dans mon modèle de données: Details et Lookup. J'ai besoin de trouver tous les objets Details associés à un objet Lookup ayant une valeur d'attribut spécifique, puis de renvoyer ces objets Details via un contrôleur de résultats récupéré.Données de base: Prédicat qui renvoie des objets d'une autre entité

Mes NSManagedObjectSubclasses:

@interface Details : NSManagedObject { 
@privateI 
} 
@property (nonatomic, retain) NSString * owner; 
@property (nonatomic, retain) NSString * introduction; 
@property (nonatomic, retain) NSString * id; 
@property (nonatomic, retain) NSString * title; 
@property (nonatomic, retain) NSString * created; 
@property (nonatomic, retain) NSString * modified; 
@property (nonatomic, retain) NSNumber * type; 
@property (nonatomic, retain) NSString * desc; 


@interface Lookup : NSManagedObject { 
@private 
} 
@property (nonatomic, retain) NSDate * search_date; 
@property (nonatomic, retain) NSString * search_phrase; 
@property (nonatomic, retain) NSSet* searchResults; 

Je dois trouver un objet Lookup basé sur son search_phrase attribut et obtenir tous les objets liés Details et retourner ceux d'un contrôleur tiré par les cheveux de résultats.

Je pense que je dois d'abord rechercher l'objet Lookup, puis parcourir les objets NSSet of Detail mais je ne sais pas comment les retourner dans le NSFetchedResultsController.

J'ai essayé:

NSPredicate *predicate =[NSPredicate predicateWithFormat:@"search_phrase = %@", self.searchPhrase]; 

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

fetchRequest.predicate = predicate; 

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Lookup" inManagedObjectContext:self.context]; 

[fetchRequest setEntity:entity]; 

NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"search_phrase" ascending:NO]; 

[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]]; 

NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.context sectionNameKeyPath:nil cacheName:@"Searches"]; 

J'ai une demande qui trouve l'objet Lookup droit, mais je ne sais pas comment les objets liés Detail du contrôleur tiré par les cheveux de résultats.

+1

pourquoi le vote vers le bas? – user7865437

+0

Votre question d'origine a été rejetée car elle n'était pas claire et était incomplète. Il était difficile pour quiconque de trouver ce dont vous aviez besoin. Je l'ai édité avec l'information additionnelle pour faire une question plus utile. – TechZen

+0

Ah je vois, désolé, je vais essayer plus difficile la prochaine fois pour rendre mon auto plus clair. – user7865437

Répondre

2

Tout d'abord, vous n'avez pas une relation réciproque définie entre Details et Lookup mais juste un sens unique Lookup-Details. Vous devez ajouter une relation à la fois l'entité modèle de données en cours d'exécution Detail-Lookup et l'ont mis a la recipocal de Lookup.searchResults et votre un quelque chose comme la propriété classe a besoin de Detail:

@property (nonAtomic,retain) Lookup *lookup; 

Avoir une relation réciproque vous permet de trouver Detail objets en commençant par un objet Lookup et vous permet de trouver un objet Lookup commençant par un objet Detail. Si vous voulez que votre vue de table affiche une liste d'objets Detail, vous devez configurer la requête de récupération du contrôleur de résultats récupérés pour récupérer l'entité Detail. En règle générale, vous définissez toujours l'entité de requête d'extraction sur l'entité dont vous souhaitez afficher les objets dans la tableview.

Le prédicat sera également exécuté sur l'entité Detail. Vous avez donc besoin d'un prédicat qui évalue un keypath qui commence par une propriété de l'entité Detail. Dans ce cas, nous voulons tous les objets Details dont l'objet Lookup associé a un attribut search_phase égal à une valeur fournie. Alors:

NSPredicate *p=[NSPredicate predicateWithFormat:@"lookup.search_phrase==%@", self.searchPhrase]; 

maintenant configurer votre FETCH ainsi:

NSFetchRequest *fetch=[[NSFetchRequest alloc] init]; 
    NSEntityDescription *detailsEntity=[NSEntityDescription entityForName:@"Details" inManagedObjectContext:self.context]; 
    [fetch setEntity:detailsEntity]; 
    [fetch setPredicate:p]; 
    //.. set up a sort however you want the details to appear in the tableview 

Donnez ce à votre NSFetchedResultsController chercher et il renverra les objets Detail que vous recherchez.

En résumé:

  • Utilisez toujours des relations réciproques dans un modèle de données afin que vous puissiez avoir la flexibilité.
  • Lors de l'utilisation d'un contrôleur de résultats récupérés, définissez l'entité de la requête d'extraction sur l'entité dont vous souhaitez afficher les objets dans la vue tabulaire.
+0

Une excellente réponse qui me le rend très clair ... MERCI! Je verrai à mettre en œuvre cela et vous laisser savoir le résultat, merci encore – user7865437

+0

Enfin, si cela fonctionne, votre méthode est sur place MERCI ;-)) – user7865437

1

Difficile de répondre sans une partie de votre code d'exemple ou même les relations réelles, mais voilà:

  • Perform votre filtre initial sur la table A. Cela vous donne un ensemble de résultats contenant un certain nombre d'objets.
  • Query Table B avec votre filtre et AND #Put name of the relationship here# IN (the results of 1)

Quelque chose à ajouter si, vous devriez cesser de penser à des données de base comme une base de données relationnelle. C'est un graphique d'objet. Les données de base peuvent ou non utiliser différentes tables pour stocker les données. Ce qui devrait vous intéresser, ce sont les objets et leurs relations. Si je comprends bien, vous ne voulez pas vraiment un à plusieurs, mais beaucoup à plusieurs. Vous serez alors en mesure d'effectuer les deux requêtes à la fois avec une requête pour les objets B: A.your.a.query == 'What you're querying for' AND your.b.querey == here

+0

Mmm traitant ceci ..... – user7865437

+0

J'ai essayé ceci: predicate = [NSPredicate predicateWithFormat: @ "type =% @ ET searchResults IN% @", self.resource, lsrm.searchResults]; mais je reçois une erreur indiquant Prédicat invalide: rien RHS – user7865437

+0

n'ayant aucune chance avec cela, quelqu'un veut me jeter un os s'il vous plaît? Prédicat NSPredicate * = [NSPredicate predicateWithFormat: @ "type =% @ ET searchResults IN% @", self.resource, lsrm.searchResults] où lsrm.searchResults est un NSSet de l'objet Lookup. Maintenant, j'obtiens une erreur en indiquant ceci: raison: 'Génération SQL non implémentée pour le prédicat – user7865437

Questions connexes