Wie schreibe ich ein BOOL-Prädikat in Core Data?

89

Ich habe ein Attribut vom Typ BOOLund möchte eine Suche nach allen verwalteten Objekten durchführen, in denen sich dieses Attribut befindet YES.

Für Zeichenfolgenattribute ist dies unkompliziert. Ich erstelle ein Prädikat wie folgt:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"userName = %@", userName];

Aber wie mache ich das, wenn ich ein Bool-Attribut namens selected habe und ein Prädikat dafür erstellen möchte? Könnte ich so etwas einfach machen?

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"selected = %@", yesNumber];

Oder brauche ich andere Formatspezifizierer und übergebe einfach YES?

Stolzes Mitglied
quelle

Antworten:

101

Aus dem Prädikat-Programmierhandbuch :

Sie geben die Gleichheit der Booleschen Werte an und testen sie, wie in den folgenden Beispielen dargestellt:

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

Sie können auch die Predicate Format String Syntax überprüfen .

albertamg
quelle
@inorganik ich einen ähnlichen Anspruch gelesen habe hier . Ich weiß nicht, was der Grund dafür ist, aber afaik sollte es funktionieren und es tut für mich.
Albertamg
@inorganik Ich habe es auch versucht und es hat funktioniert ("es tut für mich"). Ich weiß nicht, was du versucht hast. Ich bin neugierig darauf. Wenn Sie möchten, teilen Sie einen Link zu einem Testfall, damit ich genau den gleichen Code ausprobieren kann.
Albertamg
Ich habe erneut getestet und es hat funktioniert ... also habe ich mich geirrt. Etwas anderes muss meinen Fall zum Scheitern gebracht haben. So oder so +1 auf Ihre Antwort
anorganik
@inorganik oh ich verstehe. Wenn Sie herausfinden, was Ihren Fall zum Scheitern gebracht hat, würde ich gerne wissen. Danke für die +1! :)
Albertamg
91

Swift 4.0

let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true))
Viktor Kucera
quelle
Gibt es eine Möglichkeit, alle Objekte für bool abzurufen, ist gleich Null? Oder muss es immer entweder wahr oder falsch sein?
Apoorv Mote
@ApoorvMote, ab Xcode 9.4, Swift 4, ja: Wenn Sie im Prädikat einen regulären Bool-Wert verwenden, werden Elemente mit nilAttributwerten gefunden. Setzen Sie beispielsweise den Wert eines Attributs auf nil(wir sagen, Sie haben es boolAttributewie in dieser Antwort gezeigt aufgerufen ). Erstellen Sie dann Ihr Prädikat : let predicate = NSPredicate(format: "boolAttribute == %@", boolValue). Hinweis: boolValuesollte gleich trueoder falseNICHT sein NSNumber(value: boolValue). Das resultierende Prädikat lautet : boolAttribute == nil. Dieses Prädikat gibt alle Objekte zurück, wo es boolAttributeist nil.
Könnte
Das funktioniert. Sie können auch einfach das Format "boolAttribute == 1" verwenden.
Zoltan Vinkler
33

Konvertieren Sie nicht in NSNumber und verwenden Sie kein doppeltes "=="

Besser geeignet für Swift> = 4:

NSPredicate(format: "boolAttribute = %d", true)

Hinweis: "true" in diesem Beispiel ist ein Bool (eine Struktur)

Alegelos
quelle
2
sollte neu akzeptierte Antwort sein. es ist 2020 um
petes
16

Swift 3

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

In Swift 3 sollten Sie verwenden NSNumber(value: true).

Von der NSNumber(booleanLiteral: true)direkten Verwendung eines Literal-Initialisierers und im Allgemeinen wird davon abgeraten, und beispielsweise generiert SwiftLint (Version 0.16.1) eine Warnung für den ExpressibleBy...Literaldirekten Verwendungsinitialisierer:

Initialisierungsverletzung des Compiler-Protokolls: Die in Compiler-Protokollen deklarierten Initialisierer ExpressibleByArrayLiteralsollten nicht direkt aufgerufen werden. (compiler_protocol_init)

Lukas Kukacka
quelle
3
Alternativ:NSPredicate(format: "boolAttribute == %@", true as NSNumber)
Martin R
3

Swift 4

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

Swift 3

request.predicate = NSPredicate(format: "field = %@", value as CVarArg)
SoftDesigner
quelle
2
Dies führt zu einem Absturz mit Xcode 9.3 und Swift 4.1. Verwenden Sie stattdessen diese Methode .
Tamás Sengel
2

Swift 3.0 hat dies geringfügig geändert:

let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(booleanLiteral: true))
Mario Hendricks
quelle