Domanda

Ho un modello Core Data in cui un ente Task include un optional excludedOccurrences rapporto a-molti. Una delle proprietà di excludedOccurrences è inizio, che è un oggetto NSDate. L'entità ExcludedOccurrence ha inversa obbligatoria a-uno all'entità Task.

Al fine di recuperare le attività per un determinato giorno, ho bisogno di fare in modo che il giorno specificato non appare come la proprietà all'inizio di qualsiasi entità ExcludedOccurrence. Uno dei sub-predicati Sto cercando di utilizzare è quindi

NSPredicate *occurrenceIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"(ALL excludedOccurrences.start != %@))", today];

dove oggi è un oggetto NSDate per oggi compresi solo i componenti di giorno, mese e anno. Tutte le occorrenze esclusi Iniziamo proprietà comprendono anche solo i componenti di giorno, mese e anno.

Anche se questo dovrebbe bene, almeno a leggere la documentazione per Core Data e NSPredicate, ottengo il seguente messaggio di errore:

Chiusura di applicazione a causa di eccezione non identificata 'NSInvalidArgumentException', la ragione: 'predicato non supportato

Se uso il predicato equivalente

NSPredicate *occurrenceIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"!(ANY excludedOccurrences.start == %@))", today];

non viene generata un'eccezione, ma il codice non funziona come previsto:. L'occorrenza per oggi, che non dovrebbe essere esclusa, è invece esclusa

Non sono sicuro anche come eseguire il test per il caso excludedOccurrences == nil: il seguente predicato

NSPredicate *nilPredicate = [NSPredicate predicateWithFormat: @"(excludedOccurrences == nil)"];

fa sì che in fase di esecuzione l'eccezione

a-molti chiave non ammessi qui

Tuttavia, dal momento che il rapporto excludedOccurrences è facoltativo, ho anche bisogno di verificare se esso è pari a zero.

Come faccio a trattare con questo? Grazie in anticipo.

È stato utile?

Soluzione 2

con l'aiuto di tutti voi, sono finalmente riuscito a stabilire il predicato corretto per il mio scenario. Sembra che un oggetto NSDate viene gestito come un doppio, invece, il doppio non è mai qualcosa di simile a 3.7, è sempre come 3.0 Pertanto, il seguente predicato funziona correttamente nel mio test:

NSPredicate *occurrenceIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"(excludedOccurrences.@count == 0 || (excludedOccurrences.@count > 0 && NONE excludedOccurrences.start == %@))",thisDate];

dove thisDate è un oggetto NSDate contenente solo i componenti di giorno, mese e anno (come nel caso della proprietà di avvio del soggetto ExcludedOccurrence.

Test per un rapporto vuoto è fondamentalmente fatto utilizzando l'operatore di aggregazione @count, come suggerito da alcune persone di Apple.

Ancora una volta, grazie molto per il vostro aiuto. Ho ancora osservo che la documentazione è viziata in più parti (in particolare in cui si dice che tutte le opere, mentre bene, invece, non funziona affatto).

Altri suggerimenti

Per eseguire il test di un rapporto vuoto si dovrebbe confrontare il conteggio della chiave a-molti a zero.

[NSPredicate predicateWithFormat:@"excludedOccurrences.@count == 0"];

Per quanto riguarda i vostri subpredicates, essere consapevoli che si può avere solo uno dei due elementi ALL o ANY modificatori nel predicato di finale, anche se è possibile utilizzare tale modificatore più volte durante il predicato.

Non OK : ANY foo.bar = 1 AND ALL foo.baz = 2
OK: ANY foo.bar = 1 AND !(ANY foo.baz != 2)

Quindi, per testare per un rapporto non vuoto, questo funziona davvero:

[NSPredicate predicateWithFormat:@"relationship.@count != 0"]

La soluzione data dalla Ashley Clark va in crash per me dare "a-molti chiave non sono ammessi qui"

E in rapida 2, qualcosa come:

request.predicate = NSPredicate(format: " relationship.@count != 0")
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top