2010-09-08 10 views
27

Attualmente sto avendo un problema tirando tutti i dati da db in cui il parametro i.e 1 è VERO.Core Data NSPredicate controllo per il valore BOOL

Sto usando NSPredicate e seguito è riportato un codice di esempio

NSManagedObjectContext *context = managedObjectContext_; 

if (!context) { 
    // Handle the error. 
    NSLog(@"ERROR CONTEXT IS NIL"); 
} 

NSEntityDescription *entity = [NSEntityDescription entityForName:@"tblcontent" inManagedObjectContext:managedObjectContext_]; 

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"bookmarked == YES"]; 

[request setPredicate:predicate]; 

ho provato a installare predicatewithformat a quasi tutto, ma ancora non tirare fuori i segnalibri che hanno un valore YES.

Ho anche provato (@"bookmarked == %d",YES) ma con non fortuna. Non voglio dover ottenere l'intero array e quindi filtrarlo manualmente facendo if(object.bookmarked == YES) ..... blabla.

Apprezzerò molto l'aiuto.

Molte grazie.

risposta

1

Non hai menzionato quali risultati stai ottenendo. Due cose che mancano dal tuo elenco di codice è dove imposti l'entità della tua richiesta e dove effettivamente chiedi al contesto di eseguire la richiesta di recupero. Vorrei iniziare da lì.

+0

Ciao non ho incluso che nel codice. I risultati stanno ottenendo fondamentalmente l'intero lotto. È come se nessun filtro funzioni. – user281300

+0

Ciao di nuovo, penso che ci sia qualcosa di sbagliato prima. Ogni singolo contenuto ritornato ha oggetto.bookmarked = SÌ anche se l'ho impostato su NO di default. Dovrò verificarlo. Penso che il predicato funzioni. Grazie comunque. – user281300

+2

Hah sta funzionando bene ora. stupido mi sono dimenticato di resettare il db dal simulatore prima doh !! Comunque il codice qui sopra va bene. – user281300

53

Sulla base di Apple Documento Here, possiamo utilizzare i seguenti due metodi per confrontare booleano:

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

Tuttavia, quanto sopra predicato non può uscire quelli con vuoto anAttribute. Per far fronte a un attributo vuoto, è necessario il seguente metodo in base al documento di Apple here:

predicate = [NSPredicate predicateWithFormat:@"firstName = nil"]; // it's in the document 

o

predicate = [NSPredicate predicateWithFormat:@"firstName == nil"]; // == and = are interchangeable here 
11

Per qualche ragione, la soluzione di flusso non avrebbe funzionato per me:

NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == YES"]; 

Tuttavia, questo ha fatto:

NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == 1"]; 
+1

Anche per il mio caso la soluzione di Flow non ha funzionato. Ha funzionato con anAttribute == 1 –

1

Per me, è successo coz di assegnare valore in Object è sbagliato quando si salva.

si deve salvare come questo

YourNSMNanagedObject.visibleBoolean = [[NSNumber alloc] initWithBool:false] 

Poi tutto predicato funzionerà durante il recupero.

E.g.

// Filter only unvisible item 
NSPredicate *favouriteFilter = [NSPredicate predicateWithFormat:@"visibleBoolean==NO"]; 
10

Sono in ritardo alla festa e come discusso con 0 e 1 di è la strada da percorrere però c'è un modo migliore per mostrare questo utilizzando letterali NSNumber BOOL come @YES o @NO. Lo converte in 1 o 0 ma è visivamente più amichevole.

NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == %@", @NO]; 
1

core entità di dati non ha valori di default quando si crea gli attributi per entità, in modo da rendere il vostro lavoro predicato si dovrebbe o impostare i valori predefiniti per gli attributi booleani o l'uso predicato in questo modo.

Se fornire un valore di default (NO o SI) per qualsiasi proprietà booleana di Entity quindi utilizzare predicato come questo

[NSPredicate predicateWithFormat:@"boolAttribute == %@", @NO]; 
[NSPredicate predicateWithFormat:@"boolAttribute == NO", @NO]; 
[NSPredicate predicateWithFormat:@"boolAttribute == %0"]; 

Se non hanno valori di default o alcune delle entità è già stata creata senza valori predefiniti poi a filtrare dal falsa uso valore questa frase:

[NSPredicate predicateWithFormat:@"boolAttribute == %@ || boolAttribute == nil", @NO]; 
0

Continuo a ricevere po 'da th è uno e non è sempre chiaro che i booleani nei dati di base vengano salvati come NSNumbers.

Per la maggior parte mi assicuro che durante la creazione di entità ho impostato @NO per qualsiasi proprietà booleana, ma c'è sempre il caso in cui trascorro un sacco di tempo cercando di capire perché un test non passa quando ho ho dimenticato di impostare @NO sulla creazione di entità.

Questa potrebbe non essere la scelta migliore per il codice chiaro, ma ora ho iniziato a usare sempre! = Predicati per i booleani nei dati di base come (isCompleted! = YES) anziché (isCompleted == NO). Il fatto che nil == false pattern è vero ovunque ma non nei dati di base dei predicati e le proprietà possono essere molto confuse.

1

cimentandosi in con la risposta Swift 3/4:

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

dobbiamo usare NSNumber apparentemente a causa di un bool letterale non è accettabile per Apple.

Stolen from here ;)