Ich arbeite an einer iPhone-Anwendung und ich habe eine einfache Viele-zu-Viele-Beziehung mit Gruppen- und Kontaktobjekten eingerichtet. Eine Gruppe kann viele Kontakte haben und Kontakte können zu mehreren Gruppen gehören.
Ich versuche alle Gruppen auszuwählen, zu denen ein bestimmter Kontakt nicht gehört, indem ich das folgende Prädikat verwende. (Hinweis: Das Feld "uid" ist ein Zeichenfolgenfeld, das ich verwendet habe, um Kontakteinheiten eindeutig zu identifizieren)
%Vor%Nach Apples Prädikat-Programmierleitfaden ist die ALL-Aggregatoperation gültig, aber ich erhalte die folgende Ausnahme, die darauf hinweist, dass dies ein nicht unterstütztes Prädikat ist:
%Vor%Ich kann ein ähnliches Prädikat verwenden, um alle Gruppen auszuwählen, zu denen ein Kontakt bereits gehört, indem ich dieses Prädikat verwende, sodass anscheinend alle Beziehungen und Felder richtig definiert sind.
%Vor%Die Exception wird beim Konstruieren des Prädikats ausgelöst und nicht, wenn ich versuche, die Abrufanforderung tatsächlich auszuführen, so dass sie mit der von mir verwendeten Syntax und nicht mit der Core Data-Unterstützung in Beziehung zu stehen scheint. Was mache ich falsch?
Der Core Data Programming Guide sagt
Es gibt einige Interaktionen zwischen dem Abrufen und der Art des Geschäfts. In den XML-, Binary- und In-Memory-Stores erfolgt die Auswertung der Prädikat- und Sortierdeskriptoren in Objective-C mit Zugriff auf die gesamte Cocoa-Funktionalität, einschließlich der Vergleichsmethoden auf NSString. Der SQL-Speicher hingegen kompiliert die Prädikat- und Sortierdeskriptoren nach SQL und wertet das Ergebnis in der Datenbank selbst aus.
Es folgt eine Beschreibung einiger anderer Einschränkungen bei der Verwendung von NSPredate mit NSSQLiteStoreType, aber Ihre Verwendung von "ALL" ist hier eine (undokumentierte) Einschränkung, die damit zu tun hat, wie die Abrufanforderung SQL ausgibt.
Unter der Haube erzeugt CoreData drei Tabellen für Ihr Schema:
Wenn Sie myGroup.contacts aufrufen, wird so etwas wie folgt ausgeführt:
%Vor%Hinter einem Punkt ist viel los!
Wie auch immer, um Ihre Anfrage wirklich zu erfüllen, brauchen Sie so etwas. Ich habe das auf einer aktuellen SQLite-CD-Datenbank getestet, so dass die Tabellennamen seltsam aussehen, aber dennoch verständlich sein sollten:
%Vor%Ich bin kein SQL-Experte, aber meine Beobachtungen sind in erster Linie, dass diese Abfrage langsam sein wird, und zweitens, dass es ziemlich weit vom NSPredikat entfernt ist, mit dem wir angefangen haben. Es wäre also nur mit großem Aufwand möglich, dass CD eine SQL-Abfrage für das, was Sie tun möchten, vornimmt, und die Abfrage, die es hervorbringen würde, wäre nicht viel besser als eine naive Implementierung in ObjC.
>Was immer es wert ist, sagt ein Apple-Entwickler hier , dass ALLES ist in SQLite nicht unterstützt und die gegenteilige Dokumentation ist falsch. Diese Dokumentation gibt es auch 2013 noch, also scheint niemand etwas dagegen unternommen zu haben.
Wie auch immer, was Sie eigentlich tun sollten, ist ungefähr so:
%Vor%Dies wird das Prädikat in der Software auswerten.
Die grundlegende Syntax ist in Ordnung. Dies kompiliert und läuft in meinem Test:
%Vor% Wahrscheinlich liegt das Problem bei der Variablen contactUid
. Wenn es keinen Wert oder einen Wert hat, der nicht sauber in eine Zeichenfolge konvertiert wird, die NSPredicate versteht, wird der Absturz verursacht. Z.B.
... verursacht genau den von Ihnen beschriebenen Absturz.
Ich würde contactUid
unmittelbar vor dem Zuweisen zu dem Prädikat aufzeichnen, um zu sehen, was sein tatsächlicher String-Convertible-Wert ist. Die Art, wie sie in NSLog angezeigt wird, ist die Art und Weise, wie sie im Prädikat angezeigt wird, da beide die gleiche Zeichenfolgenformatierung verwenden.
Aggregierte Ausdrücke werden von Core Data nicht unterstützt.
Die obige Warnung stammt aus dem (2013) NSExpression Class Reference, in der Absatz, der sich auf Aggregierte Ausdrücke bezieht . Tatsächlich werden einige Operatoren (ANY, NONE) unterstützt, wenn sie in SQL übersetzbar sind.
Tags und Links nspredicate iphone ios core-data predicate