2009-08-04 3 views
1

Exactement comme le titre l'indique, pourquoi Core Data crée-t-il des instances de NSManagedObject avec des propriétés pour l'attribut de chaque entité, mais pas de variable d'instance associée? Le problème est que je voudrais utiliser certaines de mes 'Entités' dans un style type alloc/init typique dans certaines parties de mon code. Ne pas utiliser la récupération/le contexte de Core Data pour créer/stocker. Je suppose que je pourrais rester sans les variables d'instance, mais cela ferait-il mal de les ajouter? Puis-je aussi changer le @dynamic en @synthesize pour pouvoir utiliser KVC sur mes propriétés/ivars? Peut-être que je me trompe complètement en essayant d'utiliser une de mes entités de données de base dans certaines parties de mon code sans utiliser les API de données de base. Encore assez nouveau pour comprendre quand je peux suivre ma propre route.Pourquoi les données de base créent-elles NSManagedObject avec des propriétés mais pas de variable d'instance associée?

Répondre

16

La raison pour laquelle il n'utilise pas ivars est que ces données ne sont pas présentes. Lorsque vous chargez un objet, il ne peut pas être défaillant dans toutes ses données. Les ivars ne sont que des variables, si vous et écrivez à eux, NSManagedObject n'a aucune chance d'erreur dans la valeur s'il n'a pas encore été chargé. Via les accesseurs NSManagedObject a un point d'étranglement qui lui permet de lire les données du disque s'il n'a pas encore été défectueux, ce qui signifie que votre graphe d'objet peut être amené paresseusement. Sinon, vous devrez apporter chaque objet connecté. Pour cette raison, vous ne pouvez pas simplement ajouter des ivars, ils n'auront pas les valeurs que vous voulez. De même, vous ne pouvez pas changer de @dynamic à @synthesized, les choses ne se comporteront pas correctement. Les implémentations de propriétés dynamiques fournies par CoreData sont complètement compatibles KVC et KVO.

Si vous souhaitez accéder aux valeurs sans déclencher KVO ou KVC, vous pouvez accéder aux valeurs "primitives". Vous faites cela de deux façons. Vous utilisez primitiveValueForKey: et setPrimitive: valueForKey: ou vous pouvez simplement déclarer la primitive et laisser CD fournir des implémentations dynamiques (à partir du documentation)

@interface Department : NSManagedObject 
{ 
} 
@property(nonatomic, retain) NSString *name; 
@end 

@interface Department (PrimitiveAccessors) 
- (NSString *)primitiveName; 
- (void)setPrimitiveName:(NSString *)newName; 
@end 
3

Vous n'avez pas besoin de variables d'instance avec des données de base. Un objet géré stocke ces valeurs ailleurs.

Je ne suis jamais allé très loin avec les données de base, mais si je me souviens bien, vous êtes censé utiliser primitiveValueForKey: et setPrimitiveValue:forKey: pour effectuer ces accès à partir de vos méthodes d'accès. (En dehors de vos accesseurs, vous devez utiliser soit les accesseurs eux-mêmes, soit valueForKey:/setValue:forKey: à la place.)

Questions connexes