2010-12-02 14 views
1

Ich habe 2 Kerndateneinheiten: Question und QuestionType. Jede Frage hat genau einen FractionType.Verwenden einer Kerndateneinheit als Enum?

QuestionType hat ein string-Attribut typeName; Das ist in erster Linie, wie ich den QuestionType identifizieren kann. Es ist auf eine Liste von ein paar verschiedenen Arten festgelegt. Ich frage mich, ob es möglich ist, die Liste aller QuestionTypes in den Daten als Enum zu verwenden, oder, wenn nicht, wie kann man diese Liste am besten verwenden, um einer Frage einen QuestionType zuzuweisen und den QuestionType später zu überprüfen?

Derzeit, wenn ich eine Art auf eine Frage zuweisen möchten (basierend auf der Typname zu wissen), Ich tue dies:

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]; 

Dieses wie viel Arbeit scheint zuweisen meine einen Fragetyp zu Frage! Und ich muss dies für andere ähnliche Entitäten wiederholen.

Und dann, wenn ich will später den Fragetyp überprüfen, ich tue:

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

Dies funktioniert gut, aber ich fühle mich wie ich die question.questionType auf die spezifische Fragetyp zu vergleichen soll ich suche im Gegensatz zum Vergleich des typeName.

Gibt es eine Möglichkeit eine ENUM einzurichten, um meine Fragetypen zu halten, so dass ich das tun kann:

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

Antwort

1

Hat questionType haben ein Objekt sein? Wenn Sie eine Enumeration verwenden möchten, können Sie einfach Ihre questionType-Eigenschaft der Question-Entität als Ganzzahl deklarieren, nicht als eine andere Entität wie QuestionType.

Oder Sie können Ihre questionType Eigenschaft als eine Zeichenfolge deklarieren und direkt typeName dort behalten.

Auch wenn Sie eine Enum verwenden, ist die Syntax nicht wie EnumName.EnumKind in C/Objective-C. Siehe irgendein Lehrbuch für die Syntax.

Wenn Sie questionType als Einheit weiterverwenden, würde ich Ihnen vorschlagen, die Ergebnisse des holen im Wörterbuch cachen, wie in:

(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. 
      } 
     } 
    } 

und so ähnlich.

+0

Danke! Aktualisiert, um die Enum-Syntax zu korrigieren. Es muss ein managedObject sein, sowohl weil die Liste möglicher questionTypes auf andere Weise als durch das erneute Kompilieren aktualisiert werden kann, als auch, weil es andere Eigenschaften neben typeName enthalten kann. Aber ich glaube, ein statisches Wörterbuch wird mir geben, was ich will. – GendoIkari

+0

Habe gerade ein Problem damit festgestellt ... obwohl das großartig für das Setzen des FrageTyps ist, glaube ich nicht, dass es für den Vergleich funktionieren würde. question.questionType wäre nicht dasselbe Objekt wie mein fragmentType im Wörterbuch. weil es ein neues Objekt wäre, das von CoreData abgerufen wurde. Könnte ich eine Art von equals implementieren: Methode auf QuestionType, um true des typeName zurückzugeben, ist das gleiche? – GendoIkari

+0

Ich glaube, es ist garantiert, dass ein Eintrag in der Datenbank durch ein 'NSManagedObject' in einem' MOC' repräsentiert wird, so dass Sie einfach den Zeiger vergleichen können. Wenn Sie mehr als einen 'FrageTyp' mit demselben' typeName' haben, zählen sie natürlich als mehr als ein Objekt. Aber du solltest nicht mehr als eins erstellen; Sie sollten immer garantieren, dass es einzigartig ist. – Yuji