2010-08-10 3 views
27

Ich habe ein Kerndatenmodellobjekt namens Entry. In diesem habe ich ein Attribut IsFavorite.NSPredate - Filtern von Werten basierend auf einem gespeicherten Wert von BOOLEAN

Ich möchte ein NSPredicate verwenden, um die Ergebnisse meiner NSFetchedResultsController zu filtern.

Derzeit bekomme ich EXC_BAD_ACCESS, wenn der Abruf ausgeführt wird.

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
// Edit the entity name as appropriate. 

NSEntityDescription *thisEntry = [NSEntityDescription entityForName:@"Entry" inManagedObjectContext:managedObjectContext_]; 
[fetchRequest setEntity:thisEntry]; 

NSPredicate *fetchPredicate = [NSPredicate predicateWithFormat:@"Entry.isFavorite == %@", [NSNumber numberWithBool: YES]]; 

[fetchRequest setPredicate:predicate]; 


NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"]; 
aFetchedResultsController.delegate = self; 


NSError *error = nil; 
if (![aFetchedResultsController performFetch:&error]) { 
    NSlog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort(); 
} 

Wenn ich die Zeile entfernen, die das Prädikat auf der fetchRequest setzt, führt mein Code perfekt.

Ich bin eindeutig auf das Prädikat hin, aber hatte viel Mühe, herauszufinden, wie man Operationen auf einem BOOLEAN Wert von einem Kerndatenmodellobjekt durchführt. Es wird angemerkt, dass es Antworten darauf gibt, wie dies mit einem String oder einem int-Wert zu tun ist, aber ich kann kein BOOLEAN-Beispiel finden.

Vielen Dank!

Antwort

37

Dies ist nicht wirklich spezifisch für NSPredate ... Wenn Sie %@ in einer Formatzeichenfolge haben, muss der entsprechende Wert ein Zeiger auf ein Objekt sein, und BOOL ist nicht qualifiziert. Anstatt also JA zu übergeben, übergeben Sie [NSNumber numberWithBool: YES].


In neueren Versionen von Xcode und den SDKs, als wenn ich die Antwort ursprünglich geschrieben, können Sie @YES statt [NSNumber numberWithBool: YES] verwenden.

+0

ich meinen Code oben aktualisiert haben - die nach wie vor mit EXC_BAD_ACCESS stürzt :( Wird es Entity sein. Attribut =? Wie ich geschrieben habe? Oder nur das Attribut =? – Lance

+0

Es ist nicht das Abholen der App - Danke für Ihre Hilfe – Lance

+1

Dies funktionierte für mich, wenn ich die NSNumber Beschreibung wie diese verwendet '[[NSNumber numberWithBool: NO] Beschreibung]; ' –

22

Wenn Sie wissen, dass Sie sich für ein JA suchen (und müssen daher nicht zwischen JA oder NEIN in verschiedenen Situationen wechseln), das für mich gearbeitet:

[NSPredicate predicateWithFormat:@"isFavorite == 1"] 
+0

sollte es für einen dynamischen Wert sein. – KETAN

+5

@KETAN Wenn Sie wissen, dass Sie nach JA suchen, wird @ "isFavorite == YES" funktionieren. – brodney

+0

Ich denke, Sie sollten "% @" verwenden, @ YES – OMGPOP

-1

Für mich war es wie folgt aus

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(isComplete LIKE[c] %@)",[NSString stringWithFormat:@"%@",[NSNumber numberWithBool:YES]]]; 
27

Von Apples Dokumentation:

Boolesche Werte

Sie geben und Test auf Gleichheit der Boolesche Werte wie in den folgenden Beispielen erläutert:

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

etwas jedoch, die gefangen mich:

Seien Sie sicher, dass das Optional Entitätsattribut deaktivieren und ein Set Default Value von YES oder NO, sonst ist die Spalte leer (null?) Und die obigen Prädikate stimmen nicht mit Zeilen überein, die nicht explizit gesetzt sind.

Ich habe die große App sqllitebrowser benutzt, um diese zu diagnostizieren, indem ich mir die resultierende Simulator-Datenbank anschaue.

+0

Sorry @ János Ich weiß nicht viel Swift noch. – scipilot

+0

Vielen Dank für den Hinweis auf "Deaktivieren Sie das optionale Entitätsattribut". Habe meine Stunden gerettet! –

+0

Gut zu helfen! Ich habe Stunden damit verbracht ... jetzt passe ich mehr auf diese rechte Seite auf, ich habe sie bis dahin ignoriert. – scipilot

0

Für mich, auf SWIFT 3. 0 verwenden NSNumber und% @ nicht funktioniert hat, ich ganzzahlige Werte verwenden hatte:

let predicate = NSPredicate(format: "isFriend == %@" ,NSNumber(booleanLiteral: false)) 

folgende @scipilot die Bool beantworten sollte nicht für mich

NSPredicate(format: "yourAttributeName == %i", yourBooleanValue ? 1 : 0) 
1

swift 3-Version funktionierte prima sei optional. Dank dafür!

0

auf iOS 10, Xcode 9.0, auf der Suche nach einem Kerndaten mit Managed Boolean NO Attribut:

[NSPredicate predicateWithFormat:@"attributeName == nil"] 
Verwandte Themen