Absturz bei Aggregatoperation: "ALL" in einer Core Data iOS-Anwendung

8

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?

    
akrapacs 07.05.2011, 15:43
quelle

3 Antworten

5

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:

  • eine Tabelle für den Kontakt
  • eine Tabelle für die Gruppe
  • eine Join-Tabelle, die sie in Beziehung setzt

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.

    
Drew 25.01.2013 08:56
quelle
0

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.

%Vor%

... 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.

    
TechZen 07.05.2011 22:02
quelle
0
  

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.

    
Max_B 13.06.2013 21:02
quelle