2009-10-16 5 views
6

Ich habe ein Core Data Modell eingerichtet, wo ich zwei Objekte habe, sagen Person und Adresse. Eine Person hat eine Adresse und eine Adresse kann vielen Personen gehören. Ich habe es in Kerndaten als solche modelliert (so zeigt der Doppelpfeil auf Person, während der einzelne Pfeil auf Adresse geht)Core Data gibt NSManagedObject anstelle der Concrete-Klasse zurück, aber nur bei Verwendung. Accessor

Ich habe dann zwei Klassen für diese Objekte erstellt und einige benutzerdefinierte Methoden in diesen Klassen implementiert. Im Core Data Model habe ich die Namen der Klassen in sie eingegeben.

Wenn ich eine Adresse von Core Data direkt abrufe, gibt es mir die konkrete konkrete Klasse und ich kann meine eigenen Methoden darauf aufrufen.

Wenn ich andererseits eine Person hole und versuche, auf die Adresse durch Person zuzugreifen (zB: person.address), bekomme ich ein NSManagedObject zurück, das eine Adresse ist (zB: Ich kann zu allen Kerndatenattributen I gelangen Ich habe es eingestellt, aber es reagiert nicht auf meine benutzerdefinierten Methoden, weil es vom Typ NSManagedObject statt Adresse ist. Ist das eine Einschränkung der Core Data oder mache ich etwas falsch? Wenn es eine Beschränkung gibt, gibt es irgendwelche Arbeitsumstände?

+0

Es ist keine Beschränkung der Core Data; Sie machen sicherlich etwas falsch. Was genau meinen Sie mit "es reagiert nicht auf meine benutzerdefinierten Methoden, weil es vom Typ NSManagedObject statt Adresse ist"? Erhalten Sie eine Selektor nicht erkannte Ausnahme? Beschwert sich der Compiler? Zeigen Sie uns etwas Code und Ausgabe oder es wird schwer sein, das Problem zu diagnostizieren. –

+0

Es ist also ein Laufzeitfehler (kein Compiler), weil NSManagedObject nicht auf den Namen meiner benutzerdefinierten Methode reagiert. Derselbe Fehler, den Sie erhalten, wenn Sie den Namen Ihrer Klasse im Core Data Modeler nicht angeben. – rustyshelf

Antwort

9

Haben Sie diese Klassen mit dem Modellierer erstellt (Wählen Sie eine Entität, Datei> neue Datei ..., Verwaltete Objektklasse und dann die Modelleinheit).

Vor einiger Zeit hatte ich ein ähnliches Problem, weil ich meine verwalteten Objektmodelle nicht mit dem Modeller erstellt habe. Was ich getan habe, um sicherzustellen, dass alles läuft, war, meine eigenen Methoden (und alles, was ich implementiert habe) zu kopieren und zu speichern und mit dem Modellierer von vorne anzufangen. Dann konnte ich meine Modellklassen wieder anpassen und alles hat gut funktioniert.

Ich weiß, dass dies keine vollständige Antwort ist, aber vielleicht kann es Ihnen helfen, bis jemand genau erklärt, was vor sich geht.

Prost!

+0

Danke für den Tipp, ich habe das auf nur eine Entität versucht, aber ich werde es allen tun und sehen, ob es einen Unterschied macht – rustyshelf

+0

Das hat funktioniert! Ich habe sie alle vom Modell nachgebaut, meinen benutzerdefinierten Code wieder hinzugefügt und BAM es war glücklich. Seltsam.Ich kann nicht wirklich einen offensichtlichen Unterschied sehen, abgesehen von den zusätzlichen Methoden, die ich erzeugt habe. – rustyshelf

6

Sie haben wahrscheinlich vergessen, beim Erstellen der Entität den Namen der Klasse im Modell anzugeben - standardmäßig NSManagedObject. Klicken Sie im Modeller auf Person und Address und überprüfen Sie auf der rechten Seite, wo die Entity-Eigenschaften aufgelistet sind, dass das Feld Class korrekt mit dem Namen der entsprechenden objektiven C-Klasse ausgefüllt ist und nicht nur die standardmäßige NSManagedObject-Einstellung ist.

+0

Nein, ich habe definitiv alle gesetzt, deshalb funktioniert es, wenn ich ein Objekt dieses Typs direkt aus den Kerndaten hole – rustyshelf

+0

Tatsächlich funktioniert das Abrufen eines Objekts, unabhängig davon, ob die Klasse der Entität auf NSManagerObject festgelegt ist oder nicht. Wie @Terry Longrie jedoch hervorhebt, muss die Klasse der Entität explizit auf Person oder Address oder was auch immer gesetzt sein, damit die benutzerdefinierten Methoden eines managedObject aufgerufen werden können. Wenn Sie die benutzerdefinierte Klasse mit dem Modellierer erstellen, wie von @Lio vorgeschlagen, wird dies automatisch für Sie erledigt. Wenn Sie die benutzerdefinierte Klasse sozusagen von Hand erstellen, müssen Sie die Klasse auch manuell angeben. Ich habe einige Stunden meines Lebens damit verbracht, das herauszufinden. –

1

Ihre Implementierungsdatei für die Klasse wurde wahrscheinlich nicht zum Ziel hinzugefügt, das Sie ausführen.

(Get Info auf der .m-Datei -> Überprüfen Sie die Ziele tab)

Wenn Ihr xcdatamodel die Klasse festgelegt ist, wenn es nicht zur Laufzeit finden kann es immer noch funktioniert, werden Sie nur bekommen NSManagedObject-Instanzen stattdessen zurück. Was wird eigentlich gut funktionieren, bis Sie versuchen, eine andere Methode zu der Klasse hinzuzufügen, wie Sie gefunden haben.

+0

Das war das Problem in meinem Fall – Jan

Verwandte Themen