Domanda Come configurare un NSPredicate per cercare oggetti con un attributo nullo


Ho un ManagedObject classe uno dei membri della classe è a NSDate. Vorrei visualizzare tutti gli oggetti della classe per cui la data NON è impostata. Ho provato a utilizzare un predicato come questo:

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(date = NIL)"];

Ma ho ancora oggetti dove il date è impostato. Qual è il modo giusto per impostare un predicato per questo?


46
2018-04-21 20:26


origine


risposte:


Penso che sia un problema di maiuscole e minuscole. Puoi usare "nil" o "NULL", ma non "NIL". Questo funziona bene per me:

NSPredicate *eventWithNoEndDate = [NSPredicate predicateWithFormat:@"endDate = nil"];

94
2017-10-17 21:39



Capito. Non è possibile farlo utilizzando un predicato con un formato stringa, quindi ho provato un predicato con un modello e ha funzionato. Ecco il codice che mi ha dato oggetti che avevano endDate impostato su NULL:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"endDate = $DATE"];
predicate = [predicate predicateWithSubstitutionVariables:
                   [NSDictionary  dictionaryWithObject:[NSNull null] forKey: @"DATE"]];

9
2018-04-24 17:41



https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Predicates/Articles/pUsing.html#//apple_ref/doc/uid/TP40001794-SW4

il seguente codice dovrebbe funzionare

predicate = [NSPredicate predicateWithFormat:@"firstName = nil"];

3
2018-03-25 08:29



C'è un comportamento super fastidioso delle richieste di recupero, come documentato da Apple:

Se un oggetto in un contesto è stato modificato, un predicato viene valutato rispetto al suo stato modificato, non rispetto allo stato corrente nell'archivio permanente. Pertanto, se un oggetto in un contesto è stato modificato in modo tale da soddisfare i criteri della richiesta di recupero, la richiesta lo recupera anche se le modifiche non sono state salvate nell'archivio e i valori nell'archivio sono tali da non soddisfare i criteri. Viceversa, se un oggetto in un contesto è stato modificato in modo tale da non corrispondere alla richiesta di recupero, la richiesta di recupero non la recupererà anche se la versione nell'archivio corrisponde.

È possibile che tu stia cancellando la data altrove e che la richiesta di recupero includa i risultati in cui è presente la data nil in memoria ma ancora impostato su disco (nell'archivio permanente), e quindi quando l'oggetto si guasta carica l'oggetto con la data impostata.

Il mio unico consiglio sarebbe quello di coordinare l'accesso al contesto dell'oggetto gestito (ad esempio, in un NSOperationQueue) in modo tale che tutti gli aggiornamenti possano essere salvati nell'archivio permanente prima dell'esecuzione della richiesta di recupero.


0
2017-12-11 19:36