2010-06-11 5 views
0

Ouais, le documentation a un exemple:comment faire un attribut persistet avec une valeur scalaire comme CGFloat ou CGRect, dans les données de base?

@interface Circle : NSManagedObject 
{ 
    CGFloat radius; 
} 
@property CGFloat radius; 
@end 

@implementation Circle 

- (CGFloat)radius 
{ 
    [self willAccessValueForKey:@"radius"]; 
    float f = radius; 
    [self didAccessValueForKey:@"radius"]; 
    return f; 
} 

- (void)setRadius:(CGFloat)newRadius 
{ 
    [self willChangeValueForKey:@"radius"]; 
    radius = newRadius; 
    [self didChangeValueForKey:@"radius"]; 
} 
@end 

Mais c'est à peu près tout. Alors: Comment est-ce que je modéliserais ça? Et imaginez que c'était un CGRect ... il n'y a pas de type à sélectionner. Alors, comment cela peut-il fonctionner? Il manque un gros morceau du puzzle. Je suppose que ce sont des propriétés transitoires de type indéfini ??

+0

Où est le problème? Cela fonctionne exactement la même chose pour une propriété CGRect. –

+0

Eh bien, comment modélisez-vous cela? Comment est-ce persistet? Quel type d'attribut choisissez-vous? – dontWatchMyProfile

Répondre

2

Voir le Guide de programmation des données de base Non-Object attribue

Réponse courte, vous les définir comme transitoires d'un type non défini et stocker leurs valeurs dans un ou plusieurs attributs persistants. J'aime beaucoup de grain fin dans mes modèles, dans ce cas je créerais une entité séparée pour modéliser le rectangle. Il aurait quatre attributs de flotteur. Il aurait des valeurs transitoires pour définir et obtenir un objet rectangle réel.

(CGRect sont IIRC soutenir réellement le NSKeyedArchiveProtocol de sorte que vous ne devez pas le faire pour eux.)

Lorsque vous générez une sous-classe NSManagedObject personnalisée, les attributs de cette catégorie ne sont pas limités aux attributs de l'entité définie dans le modèle de données. Vous pouvez devenir fou et claquer sur toutes sortes d'attributs de n'importe quel type tant que vous n'essayez pas de stocker directement ce type dans le magasin persistant.

+0

Je vois. Donc, si je devais créer un attribut de type Transformable, et que je ne définissais aucune classe de transformateur personnalisée, alors NSKeyedArchiver est utilisé pour archiver un CGRect? Commence à avoir du sens ... – dontWatchMyProfile

+0

Oui. La plupart des API fournissent des types peuvent être sauvegardés sans trop de bruit. – TechZen

Questions connexes