NSManagedObject-Ausnahme "Diese Klasse ist nicht Schlüsselcode-konform" und stürzt die App in ios 6 ab, funktioniert aber für ios 5

8

Ich habe ein Problem, bei dem meine Anwendung mit der folgenden Ausnahme abstürzt:

ABC [1936: c07] * Beenden der App aufgrund der nicht abgefangenen Ausnahme 'NSUnknownKeyException', Grund: '[& lt; _NSObjectID_48_0 0xb63e310 & gt; valueForUndefinedKey:]: Diese Klasse ist für die Schlüssel-ID nicht Schlüsselcodierungskonform. '

Das seltsame Problem mit dieser Ausnahme ist, dass es bei Verwendung von iOS5 nicht auftritt. Bitte beachten Sie den Code, unter dem die Ausnahme stattfindet:

%Vor%

}

Würde diese Ausnahme verursacht werden, weil ich eine abgerufene Eigenschaft in der Klasse Tour definiert habe, die eine Reihe von TourDetail-Klassen enthält. Bitte beachten Sie den Implementierungscode für beide Klassen:

%Vor%

Jede Hilfe bei diesem Problem wird sehr geschätzt. Da ich nicht weiß, wie ich das beheben kann.

Danke, Michael

UPDATE:

Wenn ich die abgerufene Eigenschaft entferne, tritt die Ausnahme bei iOS6 nicht auf. Bitte beachten Sie das Prädikat, das ich unten konfiguriert habe:

Abgerufene Eigenschaft tourDetails Prädikat tour_id == $ FETCH_SOURCE.id

Können Sie etwas sehen, was ich bei der Einrichtung dieses Prädikats falsch mache? Mein Ziel ist es, dies zu verwenden, so dass ich ein Array von TourDetail-Objekten für jede Tour-ID zurückgeben kann, die die ID-Spalte in der Tour-Tabelle berechnet.

UPDATE:

Ich konnte aufgrund des Prädikats feststellen, dass die Ausnahme ausgelöst wird, da beim getrennten Aufrufen beider Tabellen keine Ausnahme ausgelöst wird. Können Sie ein Problem mit dem von mir erstellten Prädikat sehen?

Siehe Code unten, der zeigt, wie ich die Objekte aus der Core Data DB abrufe:

%Vor%

UPDATE:

Die Wurzel des Problems stammt definitiv aus dem Prädikat, das ich für die Eigenschaft Getetched definiert habe, aber Sie können mir raten, wie ich das Prädikat schreiben sollte, um die zwei Tabellen zu verknüpfen. Wenn ich das Prädikat tour_id == 0 schreibe und direkt auf eine ID referenziere, weiß ich, dass die abgerufene Eigenschaft korrekt funktioniert. Aber wenn ich $ FETCH_SOURCE.id verwende, wird die Schlüsselwertcodierungsausnahme ausgelöst. Mit welcher Eigenschaft referenzieren Sie die Tabelle, auf die Sie verlinken möchten?

Schätze wirklich all deine Hilfe dabei.

Danke, Michael

    
Michael Miscampbell 07.02.2013, 19:13
quelle

5 Antworten

0

Ohne den Code zu sehen, rufen Sie eine Methode für eine Klasse auf, die in iOS6 veraltet war, daher der Absturz.

    
Andrei G. 07.02.2013 19:30
quelle
0

Es gibt nichts in dem Code, den Sie für viewWillAppear gepostet haben, der Core Data auf irgendeine offensichtliche Art und Weise berührt, was es schwer macht zu erraten, was passiert. Einige dieser Objekte sind möglicherweise verwaltete Objekte, aber wer weiß, welche oder wie Sie sie erstellt haben?

Die Fehlermeldung liefert jedoch einen großen Hinweis:

%Vor%

Die Tatsache, dass hier _NSObjectID_48_0 erwähnt wird, zeigt an, dass Sie irgendwann NSManagedObjectID Instanzen verwenden, wenn Sie NSManagedObject Instanzen erwarten. NSManagedObjectID hat keine Eigenschaft mit dem Namen id , unabhängig davon, wie die Entität aussieht. Wenn Sie also nach id fragen, wird ein Fehler erzeugt, der nicht mit dem Schlüsselwert kompatibel ist.

Warum dies passieren würde, ist immer noch unmöglich zu sagen, da Sie keinen Code gepostet haben, der irgendwelche Hinweise darüber gibt, wie Sie Core Data verwenden.

Es könnte etwas mit dem Prädikat zu tun haben:

%Vor%

Wenn Sie einen Abruf erstellt haben, sodass $FETCH_SOURCE ein NSManagedObjectID ist, wäre dies ein Problem. Vielleicht (und ich kann nur vermuten) verwenden Sie es, während Sie nach einem Ergebnistyp von NSManagedObjectIDResultType fragen.

    
Tom Harrington 07.02.2013 22:18
quelle
0
  

@property (nicht atomisch, behalten) NSNumber * id;

Ist nicht id ein reserviertes Wort in Objective-C? Haben Sie versucht, diese Eigenschaft in etwas anderes umzubenennen, um zu sehen, ob dies zu Konflikten führt?

    
Amy Worrall 08.02.2013 10:00
quelle
0

Ohne in Ihren Code einzutauchen, kann NSFetchRequest den zurückgegebenen Ergebnistyp festlegen, z. B. NSManagedObject ID ResultType oder NSManagedObjectResultType.

NSManagedObjectResultType ist gewünscht, aber NSManagedObjectIDResultType wird zurückgegeben.

    
NSTNF 08.02.2015 16:48
quelle
0

Ich habe das gleiche Problem, wenn ich MagicalRecord verwende, aber kein Problem, wenn Xcode CoreData-Quellcode generiert.

    
user501836 20.09.2016 02:26
quelle

Tags und Links