2009-06-02 8 views
7

Ich bin mir sicher, dass dies eine dumme Frage sein muss, aber ich habe die Interwebbings durchforstet und finde die Antwort nicht. Viele Leute sprechen über die Verwendung des Generationsgap-Musters, in dem Sie eine NSManagedObject-Unterklasse haben, die aus Ihrem Modell generiert wird, und dann eine Unterklasse, um vorübergehende Eigenschaften und Verhaltensweisen hinzuzufügen. Der Vorteil besteht darin, dass Sie, wenn Sie Ihr beibehaltenes Modell ändern, einfach Ihre Basisdateien erneut generieren können, ohne dass die Gefahr besteht, dass Sie Ihren eigenen Code überschreiben.CoreData - wie man eine Unterklasse einer Unterklasse von NSManagedObject (Generation Gap pattern) erstellt

Ich habe ein Basis-CardMO-Objekt von NSManagedObject abgeleitet. Ich untergliedere das dann, um mein eigenes Kartenobjekt zu erstellen.

Meine Frage ist, wie erstelle ich ein Card-Objekt, das verwaltet wird?

Ich habe versucht:

Card* card = [NSEntityDescription insertNewObjectForEntityForName:@"CardMO" inManagedObjectContext:moc]; 

Aber diese Aufgabe ist nicht wirklich eine Karte, und natürlich gibt es eine Ausnahme, wenn ich gehen auf dieses Objekt eine Karte Methode aufzurufen.

Ich habe versucht, eine Karte mit alloc/init zu schaffen (wo init [super init] nur Anrufe) und dann an die managedObjectContext wie folgt ergänzt:

[moc insertObject:(CardMO*)card]; 

Das mir die kryptischen Fehler gibt " fehlgeschlagen bestimmte Initialisierung rufen NSManagedObject Klasse 'Karte'“

ich habe versucht, diese Modifikation durch den Aufruf [NSEntityDescription insertNewObjectForEntityForName: @ "CardMO" inManagedObjectContext: [AIStoreManager sharedAIStoreManager] .managedObjectContext] anstelle von [super init]. In diesem Fall ist das Objekt, das ich zurückbekomme, wieder ein CardMO, und ich kann Card-Methoden nicht aufrufen.

Was soll ich tun?

Und (für Bonuspunkte :-) - Nachdem ich diese Hürde überschritten habe, muss ich meine anderen Card-Objekte aus XML erstellen und sie dann in NSManagedObjects verwandeln. Ich benutze Code, der auf Apples XMLReaderSAX basiert - ich übergebe diesem Code einen Teil von XML und es gibt mir ein Array von vielen Card-Objekten zurück. Kann ich diese Objekte später zu meinem Kontext für verwaltete Objekte hinzufügen oder muss ich XMLReaderSAX aufrufen und ändern, wie diese Objekte erstellt werden?

Ich schreibe eine iPhone App auf 3.0, aber ich nehme an, das ist das gleiche für Core Data für 10.5.

Antwort

8

Sussed es!

Im Datenmodell muss der Klassenname für die Entität derjenige der abgeleiteten Klasse sein - in meinem Fall die Karte. Das Problem ist dann, dass Sie daran denken müssen, den Namen in CardMO zu ändern, bevor Sie neue Dateien erstellen.

Dies muss sein, warum Menschen mogenerator verwenden.

+0

Um das verwaltete Objekt aus dem Parser zu machen, musste ich in den von Apple abgeleiteten Code einsteigen und den Objekterstellungscode so ändern, dass er wie oben aussieht. Es hat gut funktioniert. –

0

Warum NSCoding nicht verwenden? Dann könnten Sie XML oder JSON oder andere Möglichkeiten zur Beschreibung des Objekts außerhalb Ihrer Anwendung unterstützen.

Verwandte Themen