2010-10-11 25 views
-1

Pour le code suivant, des deux lignes précédées de commentaire ci-dessous, seules les premières œuvres.Données de base: deux manières différentes d'accéder aux attributs, une seule fonctionne

NSManagedObject * Event = [NSEntityDescription insertNewObjectForEntityForName:str inManagedObjectContext:app.managedObjectContext]; 
//Work but strange 
[Event setValue:[NSNumber numberWithInt:buf4[v+h]] forKey:value]; 
//Error 
Event.value= [NSNumber numberWithInt:buf4[v+h]]; 

La deuxième erreur et retours

request for member 'value' in 'Event', which is of non-class type 'NSManagedObject*' 
+1

Quelle est l'erreur que vous obtenez? –

+0

"Voici mon code. – Emil

+0

Bonjour Andrew H. Vous êtes nouveau sur le site. En tant que nouvel utilisateur, vous devez comprendre que les questions formulées ont aimé ceci - sans aucun détail qui pourrait aider quelqu'un à répondre à votre question, et aussi manquer de détails de vous sur ce que vous avez essayé de faire pour le résoudre jusqu'à présent. réponses de mauvaise qualité, si vous en avez.Vous devriez reformuler cette question (ne commencez pas une nouvelle, juste éditez celle-ci) et rendez le problème beaucoup plus clair. –

Répondre

5

Avant de commencer, il est important de souligner qu'il ya des conventions qui devraient être suivies lors de l'écriture de code en Objective-C. Les noms de classes doivent commencer par une lettre majuscule: Event, NSManagedObject, MKMapView. Les variables doivent commencer par une lettre minuscule: event, currentUser, myMapView.

Maintenant, à votre problème. [Event setValue:foo forKey:value] et Event.value=foo (sic) ne sont pas identiques, sauf dans le cas où la valeur de la variable est un NSString contenant la chaîne value. (c'est-à-dire NSString *value = @"value") Plus clairement, foo.bar=baz est équivalent à [foo setValue:baz forKey:@"bar"] et non [foo setValue:baz forKey:bar].

3

Le problème que vous voyez est dû à un comportement de la classe NSManagedObject appelé stockage associatif.

Le stockage associatif transforme fondamentalement n'importe quel NSManagedObject générique en un dictionnaire dont les clés sont les noms de la propriété de l'entité qui lui est affectée. Vous définissez et accédez aux valeurs pour les clés, tout comme vous le feriez pour un dictionnaire ou toute autre classe conforme aux valeurs-clés. Ainsi, lorsque vous utilisez un objet géré générique comme celui-ci:

NSManagedObject * Event = [NSEntityDescription insertNewObjectForEntityForName:str inManagedObjectContext:app.managedObjectContext]; 

... vous obtenez une instance NSManagedObject générique avec les clés de l'entité str telle que définie dans le modèle de données. Donc, quand vous pouvez utiliser le codage clé-valeur pour stocker la valeur dans l'instance NSManagedObject générique:

[Event setValue:[NSNumber numberWithInt:buf4[v+h]] forKey:value]; 

ou plus clairement quelque chose comme:

[Event setValue:[NSNumber numberWithInt:buf4[v+h]] forKey:@"anAttributeName"]; 

Cependant, la notation par points est quelque chose de différent. Lorsque vous appelez Event.anAttributeName, vous appelez une méthode dans une sous-classe personnalisée de NSManagedObject. Pour que cela fonctionne, vous devez générer une sous-classe personnalisée avec le nom Event et l'affecter à l'entité Event dans le modèle de données.

Lorsque vous utilisez la notation point que vous appelez une méthode qui ressemble à quelque chose comme ceci:

-(void) setAnAttributeName:(NSNumber *) aNumber{ 
    //some boilerplate 
    [self setPrimativeValue:aNumber forKey:@"anAttributeValue"]; 
    // some more boilerplate 
} 

Vous pouvez écrire la méthode vous-même ou utiliser la directive du compilateur @dynamic à faire pour mais de toute façon, vous devez avoir la méthode. Aucune méthode, aucune notation par points. Lorsque vous venez d'apprendre des données de base, il est préférable d'utiliser NSManagedObjects génériques et setValue:forKey: de passer aux sous-classes NSManagedObject personnalisées.