2010-09-08 5 views
27

Je rencontre actuellement un problème en extrayant toutes les données de db, ce qui signifie que le paramètre i.e 1 est TRUE.Données de base Vérification de NSPredicate pour la valeur BOOL

J'utilise NSPredicate et ci-dessous est 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 mettre predicatewithformat à presque tout, mais il ne fonctionne toujours pas tirer sur les signets qui ont une valeur YES. J'ai même essayé (@"bookmarked == %d",YES) mais sans chance. Je ne veux pas avoir tout le tableau, puis le filtrer manuellement en faisant if(object.bookmarked == YES) ..... blabla.

J'apprécierai vraiment de l'aide.

Merci beaucoup.

Répondre

1

Vous n'avez pas mentionné les résultats que vous obtenez. Deux choses qui manquent dans votre liste de code sont l'endroit où vous définissez l'entité de votre requête et où vous demandez au contexte d'exécuter la requête d'extraction. Je commencerais là.

+0

Bonjour, je ne l'ai pas inclus dans le code. Les résultats obtiennent est essentiellement le lot entier. C'est comme si aucun filtrage ne fonctionnait. – user281300

+0

Salut à nouveau, je pense qu'il y a quelque chose de mal avant cela. I.e chaque contenu revenant a object.bookmarked = YES même si je l'ai défini par défaut sur NO. Je vais devoir vérifier. Je pense que le prédicat fonctionne. Merci quand même. – user281300

+2

Hah ça marche bien maintenant. stupide m'a oublié de réinitialiser le db du simulateur d'abord doh !! Quoi qu'il en soit, le code ci-dessus est correct. – user281300

53

Basé sur Apple document Here, nous pouvons utiliser les deux méthodes suivantes pour comparer booléenne:

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 faire face à un attribut vide, vous avez besoin de la méthode suivante selon le document d'Apple here:

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

ou

predicate = [NSPredicate predicateWithFormat:@"firstName == nil"]; // == and = are interchangeable here 
11

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

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

Cependant, cela a fait:

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

Aussi pour mon cas, la solution de Flow ne fonctionnait pas. Cela a fonctionné avec unAttribute == 1 –

1

Pour moi, il est arrivé coz de assigner la valeur dans l'objet est faux lors de l'enregistrement.

Vous devez enregistrer comme cette

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

Ensuite, tout prédicat fonctionnera lors de la récupération.

E.g.

// Filter only unvisible item 
NSPredicate *favouriteFilter = [NSPredicate predicateWithFormat:@"visibleBoolean==NO"]; 
10

Je suis en retard à la fête et comme discuté en utilisant 0 et de 1 est le chemin à parcourir mais il y a une meilleure façon de montrer à l'aide littéraux NSNumber BOOL comme @YES ou @NO. Il le convertit en un 1 ou un 0 mais est plus visuellement amical.

NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == %@", @NO]; 
1

entités de données de base n'a pas de valeurs par défaut lorsque vous créez des attributs pour l'entité, afin de rendre votre travail prédicat vous devez soit définir des valeurs par défaut pour les attributs booléens ou prédicat utilisation de cette façon.

Si vous fournissez la valeur par défaut (NO ou YES) pour une propriété booléenne d'entité utilise alors prédicat comme celui-ci

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

Si vous ne ont des valeurs par défaut ou certaines des entités a déjà été créé sans valeurs par défaut, puis filtrer par fausse valeur utilisation de cette phrase:

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

Je continue à obtenir peu par e est un et il n'est pas toujours clair que les booléens dans les données de base sont enregistrés comme NSNumbers. Pour la plupart, je m'assure que lors de la création d'entités, j'ai défini @NO pour toutes les propriétés booléennes mais il y a toujours le cas où je passe beaucoup de temps à essayer de comprendre pourquoi un test ne passe pas quand j'ai oublié de définir @NO sur la création d'entité. Cela peut ne pas être le meilleur choix pour effacer le code, mais j'ai maintenant commencé à utiliser toujours des prédicats pour les booléens dans les données de base comme (isCompleted! = YES) au lieu de (isCompleted == NO). Le fait nil == false pattern 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éroutantes.

1

faufilant avec la réponse Swift 3/4:

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

Nous devons utiliser NSNumber apparemment parce qu'un bool littéral n'est pas acceptable par Apple.

Stolen from here ;)

Questions connexes