7 Stimmen

Kann ich eine neue Instanz erstellen

Ein Beispiel von Apple: Ich habe das hier:

Event *event = (Event*)[NSEntityDescription 
    insertNewObjectForEntityForName:@"Event" 
             inManagedObjectContext:self.managedObjectContext];

Event erbt von NSManagedObject . Gibt es eine Möglichkeit, diesen seltsamen Aufruf von NSEntityDescription zu vermeiden und stattdessen nur alloc+init irgendwie direkt die Event Klasse? Müsste ich meinen eigenen Initialisierer schreiben, der nur die oben genannten Dinge tut? Oder ist NSManagedObject bereits intelligent genug, um das zu tun?

3voto

MiKL Punkte 1850

Ich habe genau das gleiche Problem. Es hat sich herausgestellt, dass man eine Entität vollständig erstellen und sie zunächst nicht zum Speicher hinzufügen kann, dann einige Prüfungen an ihr vornehmen und sie, wenn alles in Ordnung ist, in den Speicher einfügen kann. Ich verwende dies während einer XML-Parsing-Sitzung, bei der ich Entitäten erst dann einfügen möchte, wenn sie ordnungsgemäß und vollständig geparst worden sind.

Zuerst müssen Sie die Entität erstellen:

// This line creates the proper description using the managed context and entity name. 
// Note that it uses the managed object context
NSEntityDescription *ent = [NSEntityDescription entityForName:@"Location" inManagedObjectContext:[self managedContext]];

// This line initialized the entity but does not insert it into the managed object context.    
currentEntity = [[Location alloc] initWithEntity:ent insertIntoManagedObjectContext:nil];

Wenn Sie dann mit der Verarbeitung zufrieden sind, können Sie Ihre Entität einfach in den Shop einfügen:

[self managedContext] insertObject:currentEntity

Beachten Sie, dass in diesen Beispielen das currentEntity-Objekt in einer Header-Datei wie folgt definiert wurde:

id currentEntity

1voto

Joshua Nozzi Punkte 60200

Damit es richtig funktioniert, gibt es eine Menge zu tun. -insertNewObject:... ist bei weitem der einfachste Weg, seltsam oder nicht. Die Dokumentation sagt:

Ein verwaltetes Objekt unterscheidet sich Objekten in drei wesentlichen Punkten - ein verwaltetes Objekt ... Existiert in einer Umgebung definiert durch den Kontext des verwalteten Objekts ... es gibt daher eine Menge Arbeit zu tun, um ein neues verwaltetes Objekt zu erstellen zu erstellen und es ordnungsgemäß in die Core Data-Infrastruktur zu integrieren ... werden Sie vom Überschreiben von initWithEntity:insertIntoManagedObjectContext zu überschreiben:

Das heißt, Sie können es immer noch tun (lesen Sie weiter unten auf der Seite, auf die ich verlinkt habe), aber Ihr Ziel scheint "einfacher" oder "weniger seltsam" zu sein. Ich würde sagen, die Methode, die Sie als seltsam empfinden, ist eigentlich die einfachste, normalste Methode.

1voto

Rose Perrone Punkte 58235

Ich habe eine endgültige Antwort gefunden bei Mehr iPhone 3 Entwicklung von Dave Mark und Jeff LeMarche.

Wenn es Sie wirklich stört, dass Sie eine Methode auf NSEntityDescrpiton und nicht auf NSManagedObjectContext um ein neues Objekt in eine NSManagedObjectContext können Sie eine Kategorie verwenden um eine Instanzmethode hinzuzufügen zu NSManagedObjectContext .

Erstellen Sie zwei neue Textdateien mit den Namen NSManagedObject-Insert.h y NSManagedObject-Insert.m .

En NSManagedObject-Insert.h den folgenden Code ein:

import <Cocoa/Cocoa.h>
@interface NSManagedObjectContext (insert)
- (NSManagedObject *)insertNewEntityWithName:(NSString *)name;
@end

En NSManagedObject-Insert.m diesen Code ein:

#import "NSManagedObjectContext-insert.h"

@implementation NSManagedObjectContext (insert)
- (NSManagedObject *)insertNewEntityWithName:(NSString *)name
{
return [NSEntityDescription insertNewObjectForEntityForName:name inManagedObjectContext:self];
}
@end

Sie können importieren NSManagedObject-Insert.h überall dort, wo Sie diese neue Methode anwenden möchten. Ersetzen Sie dann die Insert-Aufrufe durch NSEntityDescription wie diese hier:

NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];

mit der kürzeren und intuitiveren Variante:

[context insertNewEntityWithName:[entity name]];

Sind die Kategorien nicht großartig?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X