9
votes

Créer un prédicat composé dans les données de base Xcode iPhone

Bonjour, je travaille sur les données de base avec 3 entités (classe, étudiants, examens) et leur zone de relations comme: xxx pré>

J'ai créé un prédicat pour la recherche de la liste des étudiants pour la classe 5ème . P>

NSString * fmt2 = @"studentsToClass.className=%@";
NSPredicate * p2 = [NSPredicate predicateWithFormat:fmt2,@"5th",nil];


0 commentaires

4 Réponses :


30
votes

Vous pouvez utiliser un prédicat composé: xxx

ou vous combinez simplement les tests avec "et": xxx

Notez que le Liste des arguments de prédicatwithformat n'est pas nil -attéminisé. Le nombre d'arguments est déterminé par le nombre de spécificateurs de format dans le format chaîne.


5 commentaires

@FogMeister: J'aimerais savoir.


@Martinr merci pour votre aide mais je ne suis toujours pas capable d'aller chercher le résultat de l'étudiant.My Predicate devient: StudentStoclass.classname == "5ème" et StudentStoexamrecord.result == "Pass" S'il vous plaît aider et corrigez-moi où je me trompe


@sagar: obtenez-vous une erreur ou aucun résultat? Montrez peut-être comment les entités sont définies et comment vous créez les objets. Obtenez-vous tous les objets si vous omettez le prédicat?


Si j'applique StudentsStoclass.classname == "5ème, je reçois tous les élèves d'autres enregistrements


@sagar: Mais le prédicat semble ok. Êtes-vous sûr que la relation des étudiants à examiner est définie? La valeur de l'attribut "résultat" est-elle vraiment "PASS" ou pourrait-elle être minuscule?



0
votes

Premièrement, votre prédicat indiqué est vraiment déjà faux. Vous devez référencer l'objet géré, pas sa propriété (c'est-à-dire pas le nom de la classe ). Il devrait être: xxx

En outre, vous devez vraiment choisir des noms plus lisibles pour vos variables et vos propriétés. Donc, pas fmt2 mais formatatingstring . Pas StudentStoclass mais formulaire ("Classe" est un mot spécial dans l'objectif-c). Vous avez eu l'idée.

Donc, votre prédicat composé souhaité est fait comme ceci (version courte): xxx

la version compliquée, si vous vraiment besoin Un niveau d'abstraction plus élevé (que je doute): xxx


3 commentaires

Comment rejoindre deux sous-émissaires en une seule si elles sont à la fois facultatif, c'est-à-dire A ou B et non A et B.


Ce serait une question distincte du SOF ;-).


Oui, j'ai trouvé que :) Cela se fait en utilisant OrpredicatewithSubpredcasculates:



2
votes

Tout d'abord, vous ne devriez pas vraiment appeler le Classe d'étudiant - Classe Relation StudentSoclass . Le nom de la relation devrait refléter quel type d'objet est à l'autre extrémité.

par exemple

Dans ce cas, l'étudiant relation sur classe devrait être appelé class car l'objet Il existe une seule classe une entité . La relation inverse ne doit pas être appelée classostudent il devrait être appelé étudiants car l'objet il y a un nsset de plusieurs étudiants .

edit

juste pour ajouter à cela. Le nom de la relation devrait expliquer pourquoi il est là. Nous pouvons voir que la relation est de la classe à l'étudiant, mais si vous l'appelez "Classostudent", cela n'explique rien. En outre, et si vous avez une deuxième relation de la classe à l'étudiant? Comment tu appelles cela. Si vous appelez cela participants ou élèves ou assisterstuts etc .. Il donne la signification de la relation.

Solution

Dans cet exemple, je vais les appeler comment je les appellerais et que vous verrez cela le rend un peu plus facile à comprendre ...

Quoi qu'il en soit. .. xxx


1 commentaires

Merci pour votre aide mais je ne peux toujours pas chercher l'étudiant.My prédicat devient: étudiantstoclass.classname == "5ème" et étudianttoexamrecord.result == "Pass" S'il vous plaît aider et corrigez-moi où je me trompe



0
votes

Les prédicats peuvent également être imbriqués à l'aide de prédicats composés (pour SWIFT STRAND>)

        let orPredicate = NSCompoundPredicate(type: .or, subpredicates: [date_1KeyPredicate, date_2KeyPredicate])

        let functionKeyPredicate = NSPredicate(format: "function_name = %@", self.title!)

        let andPredicate = NSCompoundPredicate(type: .and, subpredicates: [orPredicate, functionKeyPredicate])


0 commentaires