2009-12-16 3 views
0

J'ai quelques NSManagedObjects et je voudrais écrire des méthodes pour trier et comparer les propriétés sur eux.Base de données de décoration avec des méthodes de tri-comparaison

Mon problème est que puisque les Données de base définissent les propriétés comme @dynamic, elles ne peuvent pas être référencées au moment de la compilation. Cela signifie que la décoration d'un NSManagedObject avec des méthodes comme celle-ci:

- (NSComparisonResult) compareDateAndTime:(Event *) event { 
    return [originDate compare:[event originDate]]; 
} 

se traduira par le compilateur de ne pas être en mesure de localiser une propriété appelée « originDate ». La méthode ci-dessus est appelé comme ceci:

NSArray *events = [[NSArray alloc] 
     initWithArray:[unsortedEvents sortedArrayUsingSelector:@selector(compareDateAndTime:)]]; 

je pourrais aller avec prédicats ou fetchedResultController, mais je voudrais construire ces moi-même comme méthodes que j'ai un NSObjects identique pour chaque NSManagedObject. Cet objet NSObject agit comme un objet temporaire qui est transmis et rempli avant que ses propriétés ne soient définies sur NSManagedObject qui est ensuite conservé. J'ai aussi d'autres fonctions, comme des accesseurs spécialisés, que j'aimerais ajouter à NSManagedObject.

** (1) ** Existe-t-il un moyen général/pratique de décorer NSManagedObjects avec des méthodes et des fonctions ** (2) ** et de ne pas les écraser lorsque vous «reconstruisez» une classe pour une Entité ?

Merci pour toute aide ou « RTFM » donné :)

+0

J'ai répondu à vos questions (1 et 2) ci-dessous, mais je suis d'accord avec Frank que je ne comprends pas votre "problème" que vous décrivez initialement. Le compilateur devrait vous permettre d'utiliser les propriétés déclarées. Incluez-vous l'en-tête de la classe générée pour l'entité? – gerry3

Répondre

2

Je re-générer les classes de modèle pour mes entités assez souvent, alors j'ai ajouté des méthodes de soutien (y compris les mises en œuvre de getters pour les propriétés transitoires) comme « support "catégories sur les classes de modèles.

Je n'ai jamais besoin de modifier les fichiers de classe du modèle et il est impossible que je puisse accidentellement écraser mes méthodes supplémentaires. Par exemple, une entité "Place" peut avoir une chaîne de nom et des numéros de latitude/longitude. Par exemple, une entité "Place" peut avoir une chaîne de nom et des numéros de latitude/longitude. Il pourrait également avoir une propriété transitoire pour la première lettre du nom. Cela peut être utilisé comme chemin de clé de nom de section pour les titres d'index de section dans une grande vue de table.

Xcode va générer les fichiers de classe pour la "Place" entité comme ceci:

Place.h:

#import <CoreData/CoreData.h> 

@interface Place : NSManagedObject 
{ 
} 

@property (nonatomic, retain) NSString * placeName; 
@property (nonatomic, retain) NSNumber * latitude; 
@property (nonatomic, retain) NSNumber * longitude; 

@end 

Place.m:

#import "Place.h" 

@implementation Place 

@dynamic placeName; 
@dynamic latitude; 
@dynamic longitude; 

@end 

I créer une catégorie "Support" sur la classe "Place".

PlaceSupport.h:

@interface Place (Support) 

- (NSString *)uppercaseFirstLetterOfName; 
- (CLLocation*)location; 

@end 

et mettre en œuvre dans PlaceSupport.m

+0

Merci beaucoup Gerry! Mon visage est rouge ... Je ne pouvais pas me débarrasser de l'erreur du compilateur alors j'ai fini par supprimer mes ManagedObjects, les reconstruire, fermer et redémarrer Xcode et soudainement il n'y avait aucun problème pour accéder aux propriétés. (maintenant je sais pourquoi je ne pouvais pas trouver cela sur google ou dans mon livre Objective C, il n'y avait pas de problème). J'aime vraiment la solution Catégorie, je ne suis pas très expérimenté en Objective C et j'oublie que le sous-classement n'est pas toujours nécessaire. Au moins quelque chose de bon est venu de ma question :) – RickiG

0

Peut-on utiliser objectForKey:?

D'autre part, je n'ai pas eu de problème avec l'utilisation des propriétés directement dans mon code.

+0

Vous avez raison Frank, j'ai simplement couru dans un étrange comportement Xcode et n'ai pas eu l'expérience de repérer il n'y avait pas de proplem :) – RickiG

Questions connexes