Frage

Ich habe ein Core Data-Modell, in dem ein Task-Entity-Relationship-ExcludedOccurrences einen optionalen to-many enthält. Eine der Eigenschaften von ExcludedOccurrences ist zu starten, welches Objekt ein NSDate ist. Die ExcludedOccurrence Einheit hat eine inverse zwingend zu-Eins-Beziehung zu der Task-Einheit.

Um Aufgaben für einen bestimmten Tag zu holen, muss ich sicherstellen, dass der angegebene Tag erscheint nicht als Start Eigenschaft eines ExcludedOccurrence Einheit. Einer der Unter Prädikate ich deshalb zu verwenden, ich versuche, ist

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

, wo heute ein NSDate Objekt für heute nur die Tag, Monat und Jahr Komponenten einschließlich. Alle der ausgeschlossenen Ereignisse beginnen Eigenschaften nur den Tag, Monat und Jahr Komponenten auch enthalten.

Während dies sollte zumindest eine Fein die Dokumentation für Core Data und NSPredicate Lesen, erhalte ich die folgende Fehlermeldung:

Beenden app aufgrund nicht abgefangene Ausnahme 'NSInvalidArgumentException' Grund: ‚Nicht unterstütztes Prädikat

Wenn ich das Äquivalent Prädikat

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

keine Ausnahme ausgelöst wird, jedoch wird der Code nicht wie erwartet funktionieren. Das Auftreten von heute, die nicht ausgeschlossen werden sollen, wird stattdessen ausgeschlossen

Ich bin nicht sicher, wie auch für den Fall ExcludedOccurrences testen == null: das folgende Prädikat

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

führt zur Laufzeit der Ausnahme

zu viele Schlüssel hier nicht erlaubt

Da jedoch die ExcludedOccurrences Beziehung optional ist, muss ich auch testen, ob es gleich Null ist.

Wie kann ich damit umgehen? Vielen Dank im Voraus.

War es hilfreich?

Lösung 2

mit Hilfe von euch allen, ich es endlich geschafft, die richtige Prädikat für mein Szenario zu bestimmen. Es sieht so aus, dass ein NSDate Objekt als ein Doppel gehandhabt wird, aber die Doppel nie wie 3.7 etwas ist, ist es immer wie 3.0 Daher arbeitet das folgende Prädikat richtig in meinen Tests:

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

wo thisDate ist ein NSDate Objekt enthält nur die Tag, Monat und Jahr Komponenten (wie im Fall der Starteigenschaft der ExcludedOccurrence Einheit.

Die Prüfung auf eine leere Beziehung grundsätzlich mit dem @count Aggregate Operator durchgeführt wird, wie sie von einigen Leuten bei Apple vorgeschlagen.

Wieder danke sehr viel für Ihre Hilfe. Ich beobachte immer noch, dass die Dokumentation in mehreren Teilen fehlerhaft ist (vor allem, wenn er sagt, dass alles in Ordnung, während funktioniert, sondern es überhaupt nicht funktioniert).

Andere Tipps

für eine leere Beziehung testen Sie die Zählung der zu viele Schlüssel auf Null vergleichen sollte.

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

Wie für Ihre subpredicates, bewusst sein, dass Sie nur entweder den ALL oder ANY Modifikatoren in Ihrem letzten Prädikat haben kann, obwohl Sie auch diesen Modifikator mehrere Male während des Prädikats verwenden können.

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

Also, für eine nicht-leere Beziehung zu testen, das tatsächlich funktioniert:

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

Die Lösung von Ashley Clark gegeben stürzt für mich geben „zu viele Schlüssel nicht erlaubt hier“

Und in schnellen 2, so etwas wie:

request.predicate = NSPredicate(format: " relationship.@count != 0")
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top