Como escrever um predicado BOOL em Core Data?

89

Eu tenho um atributo do tipo BOOLe quero realizar uma pesquisa para todos os objetos gerenciados onde este atributo está YES.

Para atributos de string, é direto. Eu crio um predicado como este:

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

Mas como faço isso, se tenho um atributo bool chamado selecionado e quero fazer um predicado para isso? Eu poderia fazer algo assim?

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

Ou eu preciso de outros especificadores de formato e apenas passar YES?

Membro Orgulhoso
fonte

Respostas:

102

Do Guia de Programação Predicado :

Você especifica e testa a igualdade dos valores booleanos conforme ilustrado nos exemplos a seguir:

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

Você também pode verificar a sintaxe de string de formato de predicado .

Albertamg
fonte
@inorganik Eu li uma afirmação semelhante aqui . Eu não sei qual é a razão para isso, mas afaik deve funcionar e funciona para mim.
Albertamg
@inorganik Eu também tentei e funcionou ("funciona para mim"). Eu não sei o que você tentou. Estou curioso sobre isso. Se quiser, compartilhe um link para um caso de teste para que eu possa tentar exatamente o mesmo código.
Albertamg
Eu retestei e funcionou ... então eu estava errado. Outra coisa deve ter causado o fracasso do meu caso. De qualquer maneira, +1 em sua resposta
inorganik
@inorganik oh, entendo. Se você descobrir o que causou o fracasso do seu caso, eu adoraria saber. Obrigado pelo +1! :)
albertamg
94

Swift 4.0

let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true))
Viktor Kucera
fonte
Existe alguma maneira de buscar todos os objetos para bool é igual a nil ?? Ou sempre tem que ser verdadeiro ou falso ??
Apoorv Mote
@ApoorvMote, a partir do Xcode 9.4, Swift 4, sim: se você usar um valor Bool regular no predicado, os itens com nilvalores de atributo serão encontrados. Por exemplo, defina o valor de um atributo como nil(diremos que você o chamou boolAttributeconforme mostrado nesta resposta). Em seguida, crie o seu predicado: let predicate = NSPredicate(format: "boolAttribute == %@", boolValue). Nota: boolValuedeve ser igual a trueou falseNÃO NSNumber(value: boolValue). O predicado resultante será: boolAttribute == nil. Esse predicado irá devolver quaisquer objetos onde boolAttributeé nil. Pode não funcionar para sempre ...
leanne
Isso funciona. Você pode simplesmente usar o formato "boolAttribute == 1" também.
Zoltan Vinkler
39

Não converta para NSNumber, nem use double "=="

Mais apropriado para Swift> = 4:

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

Nota: "verdadeiro" neste exemplo é um Bool (um Struct)

alegelos
fonte
4
deve ser uma nova resposta aceita. é 2020, pelo amor de Deus
RyanM
16

Swift 3

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

Em Swift 3 você deve usar NSNumber(value: true).

Usar NSNumber(booleanLiteral: true)e em geral qualquer inicializador literal diretamente é desencorajado e, por exemplo, SwiftLint (v. 0.16.1) irá gerar um aviso para o ExpressibleBy...Literalinicializador de uso diretamente:

Violação de inicialização do protocolo do compilador: Os inicializadores declarados em protocolos do compilador, como ExpressibleByArrayLiteralnão devem ser chamados diretamente. (compiler_protocol_init)

Lukas Kukacka
fonte
3
Alternativamente:NSPredicate(format: "boolAttribute == %@", true as NSNumber)
Martin R de
3

Swift 4

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

Swift 3

request.predicate = NSPredicate(format: "field = %@", value as CVarArg)
SoftDesigner
fonte
2
Isso causa um travamento com o Xcode 9.3 e o Swift 4.1. Use este método .
Tamás Sengel
2

O Swift 3.0 fez uma pequena mudança nisso:

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