web-dev-qa-db-fra.com

Core Data NSPredicate vérifiant la valeur BOOL

Je rencontre actuellement un problème pour extraire toutes les données de la base de données, où 1 paramètre est VRAI.

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 définir predicatewithformat sur presque tout, mais cela ne permet toujours pas d'extraire les signets qui ont une valeur YES.

J'ai même essayé (@"bookmarked == %d",YES) mais avec pas de chance. Je ne veux pas avoir à obtenir tout le tableau et ensuite le filtrer manuellement en faisant if(object.bookmarked == YES) ..... blabla.

Je vais vraiment apprécier une aide.

Merci beaucoup.

31
user281300

Basé sur Apple Document Here , nous pouvons utiliser les deux méthodes suivantes pour comparer les valeurs booléennes:

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 anAttribute vide. Pour traiter un attribut vide, vous avez besoin de la méthode suivante selon le document Apple here :

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

ou

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

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

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

Cependant, cela a:

NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == 1"];
12
Dan Loughney

Je suis en retard pour la fête et comme indiqué, utiliser les chiffres 0 et 1 est la meilleure solution, mais il existe un meilleur moyen de le montrer en utilisant des littéraux NSNumber BOOL tels que @YES ou @NO. Il le convertit en 1 ou en 0 mais est plus convivial visuellement.

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

Les entités de base de données n'ont pas de valeur par défaut lorsque vous créez des attributs pour Entity. Pour que votre prédicat fonctionne, vous devez définir les valeurs par défaut des attributs booléens ou utiliser le prédicat de cette manière.

Si vous fournissez la valeur par défaut (NO ou YES) pour toute propriété booléenne de Entity, utilisez un prédicat comme celui-ci. 

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

Si vous n'avez pas avez des valeurs par défaut ou si certaines entités ont déjà été créées sans valeurs par défaut, utilisez cette phrase pour filtrer par false value:

[NSPredicate predicateWithFormat:@"boolAttribute == %@ || boolAttribute == nil", @NO];
3
Nikolay Shubenkov

Se faufiler avec le Swift 3/4 réponse:

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

Apparemment, nous devons utiliser NSNumber, car une valeur booléenne n'est pas acceptable par Apple.

Volé d'ici;)

2
davidrynn

Vous n'avez pas mentionné les résultats que vous obtenez. Il y a deux choses qui manquent dans votre liste de code: vous définissez l'entité de votre demande et vous demandez au contexte d'exécuter la demande d'extraction. Je commencerais par là.

1
Joshua Nozzi

Pour moi, c'est arrivé parce que la valeur assignée dans Object est fausse lors de la sauvegarde.

Tu dois sauver comme ça 

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

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

Par exemple. 

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

Je ne cesse de me faire remarquer par celui-ci et il n'est pas toujours évident que les booléens des données de base soient enregistrés en tant que NSNumbers. 

Dans la plupart des cas, lors de la création d'entités, je m'assure de définir @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 réussit pas lorsque j'ai oublié de définir @ NON sur la création d'entité. 

Ce n'est peut-être pas le meilleur choix pour du code clair, mais j'ai maintenant commencé à toujours utiliser! = Les prédicats pour les booléens dans les données de base, comme (isCompleted! = YES) au lieu de (isCompleted == NO). Le fait que nil == false soit vrai partout, mais pas dans les prédicats de données de base et les propriétés peut être très déroutant. 

0
SpaceTrucker