1

J'ai deux entité appelée "CIUser" et "CICast". L'entité "CIUser" a une relation un-à-un avec "CICast" nommée "cast". Maintenant, mon exigence est d'aller chercher tous les utilisateurs qui sont actuellement en ligne et lastUpdate est inférieure à une date calculée. Donc, je l'avais préparé ma demande de récupération commeNSPredicate: impossible d'analyser la chaîne de format pour la relation

let time = //an calculated NSDate object 

let fetchRequest = NSFetchRequest(entityName: "CIUser") 
fetchRequest.predicate = NSPredicate(format: "isLive == %@ AND cast.lastUpdate <= %@", NSNumber(bool: true), time) 

Mais planter l'application jeter *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse the format string "isLive == %@ AND cast.lastUpdate <= %@"'

Quelqu'un peut-il me aider là où je fais mal, ou quelle approche dois-je prendre. Suggestion sera appréciée.

Répondre

3

Le problème est que « CAST » est un mot réservé au format prédicat syntaxe et les mots réservés sont insensibles à la casse. Donc, ce conflit avec votre relation nommée "cast".

Pour contourner ce problème, utilisez la substitution de chemin de clé %K:

fetchRequest.predicate = NSPredicate(format: "isLive == %@ AND %K <= %@", 
          NSNumber(bool: true), "cast.lastUpdate", time) 

ou renommer la relation. Vous pouvez utiliser l'expansion %K généralement pour éviter de tels problèmes:

fetchRequest.predicate = NSPredicate(format: "%K == %@ AND %K <= %@", 
          "isLive", NSNumber(bool: true), 
          "cast.lastUpdate", time) 

Pour plus d'informations, consultez Predicate Format String Syntax dans le « Guide de programmation prédicats ».

+0

Merci @ Martinin, ça fonctionne comme un charme. –