Base de Données NSPredicate la vérification de BOOL valeur

j'ai actuellement un problème avec le fait de tirer toutes les données du db par lequel I. le paramètre e 1 est TRUE.

j'utilise NSPredicate et ci-dessous un exemple de code

NSManagedObjectContext *context = managedObjectContext_;

if (!context) {
    // Handle the error.
    NSLog(@"ERROR CONTEXT IS NIL");
}

NSEntityDescription *entity = [NSEntityDescription entityForName:@"tblcontent" inManagedObjectContext:managedObjectContext_];

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

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"bookmarked == YES"];

[request setPredicate:predicate];

j'ai essayé de définir predicatewithformat à presque tout, mais il ne tire toujours pas sur les signets qui ont une valeur YES .

j'ai même essayé (@"bookmarked == %d",YES) mais sans succès. Je ne veux pas avoir à obtenir le tableau entier et puis le filtrer manuellement en faisant if(object.bookmarked == YES) .....blabla.

j'apprécierai vraiment de l'aide.

Merci beaucoup.

30
demandé sur James Zaghini 2010-09-08 20:47:09

8 réponses

basé sur le document D'Apple ici , nous pouvons utiliser les deux méthodes suivantes pour comparer booléen:

NSPredicate *newPredicate = [NSPredicate predicateWithFormat:@"anAttribute == %@",[NSNumber numberWithBool:aBool]];
NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == YES"];

cependant, le prédicat ci-dessus ne peut pas sortir ceux avec vide anAttribute . Pour traiter un attribut vide, vous avez besoin de la méthode suivante selon le document D'Apple ici :

predicate = [NSPredicate predicateWithFormat:@"firstName = nil"]; // it's in the document

ou

predicate = [NSPredicate predicateWithFormat:@"firstName == nil"]; // == and = are interchangeable here
57
répondu Mingming 2013-05-21 08:18:29

pour une raison quelconque, la solution de Flow ne fonctionnerait pas pour moi:

NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == YES"];

Cependant, ce n':

NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == 1"];
11
répondu Dan Loughney 2014-02-26 13:52:34

je suis en retard à la partie et comme discuté en utilisant 0 et 1's est la façon d'aller mais il ya une meilleure façon de le montrer en utilisant NSNumber BOOL littérales comme @YES ou @NO. Il le convertit en un 1 ou un 0 mais est visuellement plus sympa.

NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == %@", @NO];
10
répondu Patrick 2015-04-01 00:04:55

Core Data entities n'a pas de valeurs par défaut lorsque vous créez des attributs pour Entity, donc pour faire fonctionner votre prédicate, vous devriez soit définir des valeurs par défaut pour les attributs booléens, soit utiliser le prédicate de cette façon.

Si vous fournir une valeur par défaut (NON ou OUI) pour toute propriété booléenne de l'Entité ensuite utiliser prédicat comme ce

[NSPredicate predicateWithFormat:@"boolAttribute == %@", @NO];
[NSPredicate predicateWithFormat:@"boolAttribute == NO", @NO];
[NSPredicate predicateWithFormat:@"boolAttribute == %0"];

Si vous ne pas ont les valeurs par défaut ou certaines des entités ont déjà été créées sans valeurs par défaut puis filtrer par false valeur utiliser cette phrase:

[NSPredicate predicateWithFormat:@"boolAttribute == %@ || boolAttribute == nil", @NO];
2
répondu Nikolay Shubenkov 2016-07-12 15:14:53

se faufiler avec la réponse SWIFT 3/4:

let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true))

nous devons utiliser NSNumber apparemment parce qu'une bulle littérale n'est pas acceptable par Pomme.

volé d'ici ;)

2
répondu davidrynn 2017-11-16 19:47:59

vous n'avez pas mentionné les résultats que vous obtenez. Deux choses qui manquent à votre liste de codes sont où vous définissez l'entité de votre requête et où vous demandez réellement au contexte d'exécuter la requête fetch. Je voudrais commencer par là.

1
répondu Joshua Nozzi 2010-09-08 16:55:39

pour moi, il s'est produit parce que la Valeur assignée dans L'objet est erronée lors de l'enregistrement.

vous devez Vous enregistrer comme ce

YourNSMNanagedObject.visibleBoolean = [[NSNumber alloc] initWithBool:false]

alors tous les prédicats fonctionneront lors de la récupération.

E. G.

// Filter only unvisible item
NSPredicate *favouriteFilter = [NSPredicate predicateWithFormat:@"visibleBoolean==NO"];
1
répondu Megamind 2014-11-05 04:05:30

je continue à me faire mordre par celui-ci et il n'est pas toujours clair que les booléens dans les données de base sont enregistrés en tant que NN.

pour la plupart, je m'assure lors de la création d'entités que j'ai mis @NO pour toutes les propriétés booléennes, mais il ya toujours le cas où je passe un tas de temps à essayer de comprendre pourquoi un test ne passe pas quand j'ai oublié de mettre @NO sur la création d'entités.

ce n'est peut-être pas le meilleur choix pour un code clair, mais j'ai commencé à utilisez toujours != prédicats pour les booléens dans les données de base comme (isCompleted != Oui) au lieu de (isCompleted == Non). Le fait que nil = = faux modèle est vrai partout ailleurs, mais pas dans les prédicats de données de base et les propriétés peuvent être très déroutant.

0
répondu SpaceTrucker 2017-01-19 20:08:22