2009-07-01 7 views
2

J'ai un NSFetchedResultsController qui récupère des objets à partir d'un NSManagedObjectContext.Filtre NSFetchedResultsController pour une valeur nulle?

Ces objets ont une propriété lastOpened, qui est initialement nil et est définie uniquement lorsqu'ils sont affichés.

Je veux que mon UITableView affiche une liste des derniers objets ouverts, ce que je peux faire en ajoutant un NSSortDescriptor au NSFetchRequest.

Question:

Je ne veux pas afficher les objets qui ont jamais été étudiés. (lastOpened == nil) Puis-je trier par le même NSFetchRequest? Y a-t-il un meilleur moyen de filtrer les données?

Merci.

Répondre

8

Absolument. Ce que vous cherchez est un NSPredicate. Fondamentalement, il vous permet de spécifier une ou plusieurs conditions auxquelles vous voulez que vos objets récupérés répondent, puis récupère seulement les objets qui correspondent à ces conditions.

Construire des prédicats est une proposition un peu délicate, cependant - vous pouvez jeter un oeil au guide Predicate Format String Syntax pour commencer. Pour votre cas particulier, c'est encore plus compliqué car je ne suis pas sûr qu'il existe une représentation de la valeur nulle dans les termes prédicats. Vous pouvez contourner ce problème, cependant, en utilisant une date dans le passé lointain:


             
  
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"lastOpened > %@", [NSDate dateWithTimeIntervalSince1970:0]]; 
  

Vous pouvez juste vérifier contre zéro directement dans un prédicat:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"lastOpened != nil"];

Cela crée un prédicat qui permet seulement objets avec une date fixe (à partir du 1er janvier 1970) à renvoyer. Vous auriez alors ajouter le prédicat à la demande de récupération avant de l'exécuter:

// Assuming you have some almost-ready NSFetchRequest *request: 
[request setPredicate:predicate];
+0

C'est fantastique. J'ai eu une intuition des prédicats ont été impliqués. Merci! –

5

Essayez ceci:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"lastOpened != nil"]; 
... // add sort descriptors etc. 

Ajoutez ensuite la demande d'extraction au NSFetchResultsController.

0

Pour Swift, vous pouvez initialiser NSPredicate avec un booléen pour revenir toujours vrai, en fait un filtre qui ne filtre rien

return fetchedResultsController("Terminal", withFilter: NSPredicate(value: true), sortColumns: sortColumns, sortDirections: sortDirections) 
Questions connexes