2010-01-27 5 views
13

Ich habe ein Core Data-Modell, wo ich eine Entität A habe, die eine Zusammenfassung ist. Die Entitäten B, C und D erben von Entität A. In Entität A sind mehrere Eigenschaften definiert, die von B, C und D verwendet werden. Ich möchte diese Vererbung in meinem Modellcode nutzen. Zusätzlich zu den Eigenschaften frage ich mich, ob ich der Entität A Methoden hinzufügen kann, die in ihren Untereinheiten implementiert sind.Hinzufügen von benutzerdefinierten Methoden zu einem untergeordneten NSManagedObject

Zum Beispiel:

  1. ich eine Methode zur Schnittstelle für die Entität A hinzuzufügen, die einen Wert zurückgibt und ein Argument
  2. I Implementierungen dieser Methode A hinzuzufügen, B, C, D
  3. Dann rufe ich executeFetchRequest: alle Instanzen von B
  4. ich die Methode auf den abgerufenen Objekte aufrufen abzurufen, die die Durchführung des Verfahrens in B-Implementierung enthalten nennen sollte

Ich habe dies versucht, aber beim Aufruf der Methode, ich erhalten:

[NSManagedObject Methoden:]: Unbekannter Selektor gesendet Instanz

Ich nehme an, dies liegt daran, dass die von zurückgegebenen Objekte executeFetchRequest: sind Proxy-Objekte irgendeiner Art.

Gibt es eine Möglichkeit, die Vererbung mit Hilfe von untergeordneten NSManagedObjects zu nutzen?

Ich würde wirklich gerne in der Lage sein, dies zu tun, sonst wäre mein Modellcode verantwortlich für die Bestimmung, welche Art von NSManagedObject es handelt und führen spezielle Logik nach dem Typ, was nicht wünschenswert ist.

Jede Hilfe wird geschätzt, danke im Voraus.

Antwort

25

Es sollte funktionieren. Die von executeFetchRequest: zurückgegebenen Objekte sind echte Instanzen von s (oder Unterklassen davon). Die Schritte zum Verwenden benutzerdefinierter Klassen in CoreData sind wie folgt. Angenommen, Sie haben die Entitäten A und B, wobei B von A erbt. Dann brauchen Sie zwei benutzerdefinierte Klassen als

@interface A:NSManagedObject{ 
} 
-(void)someMethod:(NSString*)a; 
@end; 
@interface B:A{ 
} 
-(void)someMethod:(NSString*)a; 
@end; 

Dann sie in dem XCode Datenmodellierer gesetzt, wie gezeigt:

screenshot of XCode modeler

diese Weise wird die Coredata ordnet automatisch die richtige Klasse der NSManagedObject, wenn es wird aus der Datenbank geholt.

+2

Vielen Dank! Mein Datenmodell verwendete NSManagedObject; Ich hatte nicht einmal bemerkt, dass ich den Klassennamen spezifizieren musste, funktioniert perfekt! –

+9

Ich sehe den Screenshot in dieser Antwort nicht - kann jemand ihn ersetzen (Yuji)? –

+0

Leider ist der Screenshot nicht verfügbar! :( –

18

Wenn Sie diese Ausnahme erhalten, bedeutet dies, dass Core Data Ihre benutzerdefinierte Klasse nicht verwendet. Der Schlüssel hier ist NSManagedObject - das ist das Objekt Core Data für die Objekte in Ihrem Datenspeicher erstellt.

Wenn Sie dies noch nicht getan haben, müssen Sie eine Klasse erstellen, die von NSManagedObject erbt, fügen Sie dort Ihre benutzerdefinierten Methoden hinzu und legen dann die Entität A fest, um Ihre benutzerdefinierte Klasse im Objektmodell-Tool zu verwenden. Wenn die Entitäten B, C, usw. bestimmte Verhaltensweisen aufweisen, sollten Sie die Klasse, die Sie für die Entität A erstellt haben, von der Unterklasse ableiten und diese Entitäten auch den Unterklassen zuweisen.

Im Wesentlichen haben Sie eine parallele Hierarchie: eine Hierarchie von Entitäten und eine andere von Klassen. Sie werden wahrscheinlich mit Entität X und Klasse X für jede Entität in Ihrem Objektmodell enden.

+1

Danke, Sie hatten die richtige Antwort, aber Yuji stellte mir den Screenshot zur Verfügung, der mich wirklich in die richtige Richtung wies. Wenn ich deine Antwort auch akzeptieren könnte, würde ich es tun. –

+0

So einfach zu vergessen xcdatamodel, wenn Sie den Namen einer Entitätsklasse ändern !! Ihre Antwort hat mir viel Zeit gespart !! Danke so viel :-) – jpswain

+0

+1 Vielen Dank für den Tipp "set entity Ihre benutzerdefinierte Klasse im Objektmodell-Tool zu verwenden". Für mich habe ich die automatisch generierte Klasse nicht verwendet, also habe ich diesen Schritt übersprungen! –

1

Ich hatte diesen gleichen Fehler für den gleichen zugrunde liegenden Grund, aber es kam in einer anderen Situation und einer anderen Heilung. Ihr Vorschlag hat mir sehr geholfen!

Ursprünglich hatte ich meine Klasse erstellt, die meine Eingabe von Hand implementierte. Ich wusste nicht, dass es dafür ein Xcode-Menü gab. Ich denke, der Link war nie da! Erst als ich die neuen benutzerdefinierten Methoden (nicht Setter/Getter) hinzugefügt und damit begonnen hatte, fing ich an, den Fehler zu bekommen.

Meine Lösung war, den Namen meiner Klasse zu ändern, habe Xcode die Klasse für meine Eingabe über Editor->Create NS Mangage Object.... neu erstellen Dann schneiden Sie und fügen Sie den alten Code in die neue Klasse ein. Kein Unterschied im Code!

Xcode scheint eine Art interner Link zu haben, der im Code nicht ersichtlich ist.

2

Nach dem Versuch, viele Lösung Aufruf isMemberOfClass auf meiner NSManagedObject-Unterklasse vor dem Versuch, meine benutzerdefinierte Methode zu verwenden, machte den Trick.

+0

Dies war die einzige Lösung, die für mich funktionierte.Ich glaube, das hat mit der Tatsache zu tun, dass mein CoreData-Code alles in einer statischen Bibliothek ist, im Gegensatz zu direkt in der Hauptanwendung, aber ich bin mir da nicht ganz sicher. – BenV

+0

das hat auch Trick für mich, als mein Kerndatencode ist in der statischen Bibliothek und ich benutze es als Unterprojekt in einer anderen App +1 für Ihre Antwort @ micheal23 – Talha

Verwandte Themen