Использование основного объекта данных в качестве перечисления? - PullRequest
1 голос
/ 02 декабря 2010

У меня есть 2 основных объекта данных: Question и QuestionType.Каждый вопрос имеет ровно 1 вопросник.

Вопросник имеет строковый атрибут typeName;что в первую очередь определяет, какой это тип вопроса.Он фиксируется в списке нескольких разных типов.Мне интересно, можно ли использовать список всех типов вопросов в данных как перечисление, или, если нет, как лучше всего использовать этот список для назначения типа вопроса для вопроса и проверки типа вопроса позже?

В настоящее время, когда я хочу назначить тип для вопроса (основываясь на знании typeName), я делаю это:

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

Это похоже на большую работу только для назначения QuestionTypeна мой вопрос!И я должен повторить это для других подобных объектов.

А потом, когда я хочу проверить тип вопроса позже, я делаю:

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

Это работает нормально, но я чувствую, что яследует сравнивать question.questionType с конкретным вопросом QuestionType, который я ищу, а не просто сравнивать typeName.

Есть ли способ настроить перечисление для хранения моих QuestionTypes, чтобы я мог сделать это:

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

1 Ответ

1 голос
/ 03 декабря 2010

Должен ли questionType быть объектом? Если вы хотите использовать перечисление, вы можете просто объявить ваше свойство questionType сущности Question как целое число, а не как другую сущность типа QuestionType.

Или, вы можете объявить ваше свойство questionType как строку и напрямую хранить typeName там.

Даже когда вы используете перечисление, синтаксис не похож на EnumName.EnumKind в C / Objective-C. Смотрите любой учебник для синтаксиса.

Если вы продолжаете использовать questionType в качестве сущности, я бы предложил вам кэшировать результаты выборки в словаре, как в:

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

и что-то в этом роде.

...