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?

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 .


@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))

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)


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)


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)

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))
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.