2010-12-02 41 views
1

J'ai 2 entités de données principales: Question et QuestionType. Chaque question a exactement 1 QuestionType.L'utilisation d'une entité de données de base comme énumération?

QuestionType a un attribut de type typeName; ce qui est principalement comment j'identifie quel QuestionType c'est. Il est fixé à une liste de quelques types différents. Je me demande s'il est possible d'utiliser la liste de tous les QuestionTypes dans les données comme une énumération, ou sinon, quelle est la meilleure façon d'utiliser cette liste pour assigner un QuestionType à une Question, et vérifier le QuestionType plus tard?

Actuellement, quand je veux attribuer un type à une question (basée sur la connaissance du typeName), je fais ceci:

NSFetchRequest *questionTypeFetchRequest = [[NSFetchRequest alloc] init]; 
questionTypeFetchRequest.entity = [NSEntityDescription entityForName:@"QuestionType" inManagedObjectContext:self.managedObjectContext]; 
NSPredicate *questionTypePredicate = [NSPredicate predicateWithFormat:@"typeName like %@", [questionData objectForKey:@"questionType"]]; 
questionTypeFetchRequest.predicate = questionTypePredicate; 
question.questionType = [[self.managedObjectContext executeFetchRequest:questionTypeFetchRequest error:&error] objectAtIndex:0]; 

Cela semble être beaucoup de travail juste pour attribuer un questiontype à mon Question! Et je dois répéter cela pour d'autres entités similaires.

Et puis quand je veux vérifier le questiontype plus tard, je suis en train de faire:

if ([question.questionType.typeName isEqualToString:@"text"]){ 

Cela fonctionne très bien, mais je me sens comme je comparerai le question.questionType à questiontype spécifique Je cherche , par opposition à simplement comparer le typeName.

Est-il possible de mettre en place un ENUM de tenir mes QuestionTypes, afin que je puisse le faire:

question.questionType = Text; 
switch(question.questionType) 
{ 
    case Text: 

Répondre

1

Est-ce que questionType doivent être un objet? Si vous voulez utiliser une énumération, vous pouvez simplement déclarer votre propriété questionType de l'entité Question comme étant un entier, pas une autre entité comme QuestionType. Vous pouvez également déclarer votre propriété questionType comme étant une chaîne et y conserver directement typeName.

Même lorsque vous utilisez une énumération, la syntaxe n'est pas EnumName.EnumKind dans C/Objective-C. Voir n'importe quel manuel pour la syntaxe.

Si vous continuez à utiliser questionType comme une entité, je vous suggère de mettre en cache les résultats de la chercher dans le dictionnaire, comme dans:

(QuestionType*)questionTypeWithName:(NSString*)name 
    { 
     static NSMutableDictionary*dict=nil; 
     if(!dict){ 
      dict=[[NSMutableDictionary alloc] init]]; 
     } 
     QuestionType*qt=[dict objectForKey:name]; 
     if(qt){ 
       return qt; 
     }else{ 
      NSFetchRequest *questionTypeFetchRequest = [[NSFetchRequest alloc] init]; 
       ... 
      NSArray*result = ... executeFetchRequest: ... 
      if(result){ 
        ... 
        add the resulting qt to the dict ... 
        ... 
      }else{ 
        create a new QuestionType entity with a given name 
        add it to the dict. 
        return it. 
      } 
     } 
    } 

et quelque chose comme ça.

+0

Merci! Mise à jour pour corriger la syntaxe Enum. Il doit être un managedObject à la fois parce que la liste des questionTypes possibles devrait pouvoir être mise à jour par d'autres moyens que la recompilation, et parce qu'elle peut contenir d'autres propriétés en dehors de typeName. Mais je crois qu'un dictionnaire statique me donnera ce que je veux. – GendoIkari

+0

Juste réalisé un problème avec cela ... bien que cela fonctionne très bien pour définir le questionType, je ne pense pas que cela fonctionnerait pour le comparer. question.questionType ne serait pas le même objet que mon questionType qui est dans le dictionnaire; parce que ce serait un nouvel objet récupéré à partir de CoreData. Pourrais-je implémenter une sorte d'equals: la méthode sur QuestionType pour renvoyer true de typeName est la même? – GendoIkari

+0

Je crois qu'il est garanti qu'une entrée dans la base de données est représentée par un 'NSManagedObject' dans un' MOC', donc vous pouvez juste comparer le pointeur. Bien sûr, si vous avez plus d'un 'QuestionType' avec le même' typeName', ils comptent comme plus d'un objet. Mais vous ne devriez pas en créer plus d'un; vous devriez toujours garantir que c'est unique. – Yuji