Come scrivere un predicato BOOL in Core Data?


89

Ho un attributo di tipo BOOLe desidero eseguire una ricerca per tutti gli oggetti gestiti in cui si trova questo attributo YES.

Per gli attributi di stringa è semplice. Creo un predicato come questo:

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

Ma come posso farlo, se ho un attributo bool chiamato selezionato e voglio creare un predicato per questo? Potrei semplicemente fare qualcosa di simile?

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

O ho bisogno di altri specificatori di formato e basta YES?

Risposte:


101

Dalla Predicate Programming Guide :

Specificare e verificare l'uguaglianza dei valori booleani come illustrato nei seguenti esempi:

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

Puoi anche controllare la sintassi della stringa del formato predicato .


@inorganik Ho letto una dichiarazione simile qui . Non so quale sia la ragione di questo, ma afaik dovrebbe funzionare e lo fa per me.
albertamg

@inorganik l'ho anche provato e ha funzionato ("fa per me"). Non so cosa hai provato. Ne sono curioso. Se vuoi, condividi un link a un test case così posso provare lo stesso identico codice.
albertamg

Ho ripetuto il test e ha funzionato ... quindi mi sbagliavo. Qualcos'altro deve aver causato il fallimento del mio caso. In ogni caso, +1 sulla tua risposta
inorganik

@inorganik oh capisco. Se scopri cosa ha causato il fallimento del tuo caso, mi piacerebbe saperlo. Grazie per il +1! :)
albertamg

93

Swift 4.0

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

C'è un modo per recuperare tutti gli oggetti per bool è uguale a zero? O deve sempre essere vero o falso?
Apoorv Mote

@ApoorvMote, a partire da Xcode 9.4, Swift 4, sì: se usi un valore Bool normale nel predicato, nilverranno trovati gli elementi con i valori degli attributi. Ad esempio, imposta il valore di un attributo su nil(diremo che lo hai chiamato boolAttributecome mostrato in questa risposta). Quindi, creare il predicato: let predicate = NSPredicate(format: "boolAttribute == %@", boolValue). Nota: boolValuedovrebbe essere uguale a trueo false, NON NSNumber(value: boolValue). Il predicato risultante sarà: boolAttribute == nil. Questo predicato sarà prodotto oggetti in cui boolAttributeè nil. Potrebbe non funzionare per sempre ...
Leanne

Questo funziona. Puoi anche usare semplicemente il formato "boolAttribute == 1".
Zoltan Vinkler

35

Non convertire in NSNumber, né utilizzare il doppio "=="

Più appropriato per Swift> = 4:

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

Nota: "true" in questo esempio è un Bool (uno Struct)


2
dovrebbe essere una nuova risposta accettata. è il 2020 per l'amor di pete
RyanM

16

Swift 3

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

In Swift 3 dovresti usare NSNumber(value: true).

L'uso NSNumber(booleanLiteral: true)diretto e in generale di qualsiasi inizializzatore letterale è sconsigliato e ad esempio SwiftLint (v. 0.16.1) genererà un avviso per l' ExpressibleBy...Literalinizializzatore di utilizzo direttamente:

Violazione dell'inizializzazione del protocollo del compilatore: gli inizializzatori dichiarati nei protocolli del compilatore come ExpressibleByArrayLiteralnon dovrebbero essere chiamati direttamente. (compiler_protocol_init)


3
In alternativa: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)

2
Ciò causa un arresto anomalo con Xcode 9.3 e Swift 4.1. Usa invece questo metodo .
Tamás Sengel

2

Swift 3.0 ha apportato una leggera modifica a questo:

let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(booleanLiteral: true))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.