2010-01-25 4 views
7

D'un exemple d'Apple, j'ai ceci:Puis-je créer une nouvelle instance de ma classe d'objets gérés personnalisée sans passer par NSEntityDescription?

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

Event hérite de NSManagedObject. Est-il un moyen d'éviter cet appel bizarre à NSEntityDescription et à la place juste alloc+init en quelque sorte directement la classe Event? Est-ce que je devrais écrire mon propre initialiseur qui fait juste ce genre de choses ci-dessus? Ou est NSManagedObject déjà assez intelligent pour le faire?

Répondre

5

NSManagedObject fournit une méthode appelée initWithEntity:insertIntoManagedObjectContext:. Vous pouvez l'utiliser pour faire une paire plus traditionnelle alloc/init. Gardez à l'esprit que l'objet renvoyé est et non autoreleased.

+0

Oh oui, mais ne remplacent jamais 'initWithEntity: insertIntoManagedObjectContext:'. 'awakeFromInsert' est l'endroit approprié pour faire l'initialisation. – Alex

1

Pour le faire fonctionner correctement, il y a beaucoup de choses à faire. -insertNewObject: ... est de loin le plus simple, bizarre ou non. The documentation dit:

Un objet géré diffère des autres objets de trois façons principales d'un objet- géré ... existe dans un environnement défini par son contexte d'objet géré ... il y a donc beaucoup de travailler à faire pour créer un nouvel objet géré et intégrer correctement dans le de base de l'infrastructure de données ... vous êtes découragée de surcharger initWithEntity: insertIntoManagedObjectContext:

Cela dit, vous pouvez toujours le faire (lire plus bas sur la page à laquelle j'ai lié) mais votre objectif semble être "plus facile" ou "moins bizarre". Je dirais que la méthode que tu trouves bizarre est en fait la façon la plus simple et la plus normale.

1

J'ai trouvé une réponse définitive de Plus de développement iPhone 3 par Dave Mark et Jeff LeMarche.

Si cela vous dérange vraiment que vous utilisez une méthode sur NSEntityDescrpiton plutôt que sur NSManagedObjectContext d'insérer un nouvel objet dans un NSManagedObjectContext, vous pouvez utiliser une catégorie d'ajouter une méthode d'instance à NSManagedObjectContext.

créer deux nouveaux fichiers texte appelés NSManagedObject-Insert.h et NSManagedObject-Insert.m.

Dans NSManagedObject-Insert.h, placez le code suivant:

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

Dans NSManagedObject-Insert.m, placez ce code:

#import "NSManagedObjectContext-insert.h" 

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

Vous pouvez importer NSManagedObject -Insert.h partout où vous souhaitez utiliser cette nouvelle méthode.Remplacez ensuite les appels d'insertion contre NSEntityDescription, comme celui-ci:

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

avec la plus courte et plus intuitive un:

[context insertNewEntityWithName:[entity name]]; 

catégories ne sont pas grand?

3

J'ai rencontré exactement le même problème. Il s'avère que vous pouvez complètement créer une entité et ne pas l'ajouter au magasin au début, puis faire des vérifications et si tout est bon, insérez-le dans le magasin. Je l'utilise lors d'une session d'analyse XML où je veux seulement insérer des entités une fois qu'elles ont été correctement et entièrement analysées.

Tout d'abord, vous devez créer l'entité:

// 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]; 

Ensuite, une fois que vous êtes satisfait du traitement que vous pouvez simplement insérer votre entité dans le magasin:

[self managedContext] insertObject:currentEntity 

Notez que dans ces exemples, la L'objet currentEntity a été défini dans un fichier d'en-tête comme suit:

id currentEntity 
Questions connexes