Как я могу установить пользовательский атрибут NSManagedObject, который рассчитывается из других атрибутов? - PullRequest
1 голос
/ 30 апреля 2010

Я использую базовую структуру данных для управления объектами. У меня есть сущность, которая имеет несколько атрибутов десятичных типов. Среди них есть атрибут, который математически вычисляется из других атрибутов. Пример:

@interface Marks :  NSManagedObject  
{  
}

@property (nonatomic, retain) NSDecimalNumber * answerGradeA;  
@property (nonatomic, retain) NSDecimalNumber * answerGradeB;  
@property (nonatomic, retain) NSDecimalNumber * answerGradeC;  
@property (nonatomic, retain) NSDecimalNumber * total;

Здесь я хочу атрибут total = 3xanswerGradeA + 2xanswerGradeB + 1xanswerGradeC.

Если это возможно, то как?

Ответы [ 3 ]

6 голосов
/ 02 мая 2010

Способ Core Data состоит в том, чтобы добавить «итого» в качестве атрибута к модели и пометить его как «временный». Затем вы предоставляете реализацию в подклассе.

@interface Marks :  NSManagedObject  
{
}
@property (nonatomic, readonly) NSDecimalNumber* total;
@end

@implementation Marks (Calculated)
- (NSDecimalNumber*) total { 
    return (3 * [self valueForKey:@"answerGradeA"]) + (2 * [self valueForKey:@"answerGradeB"]) + [self valueForKey:@"answerGradeC"]; 
}
+ (NSSet *)keyPathsForValuesAffectingTotal
{
    return [NSSet setWithObjects:@"answerGradeA", @"answerGradeB", @"answerGradeC", nil];
}
@end

Это обеспечит правильное кэширование и обновление всего.

2 голосов
/ 01 мая 2010

Почему бы не сделать это категорией и скомпилировать ее в отдельный файл? (Строго говоря, total не должен быть частью CoreData.)

@interface Marks (Calculated)
@property (nonatomic, readonly) NSDecimalNumber* total;
@end

@implementation Marks (Calculated)
- (NSDecimalNumber*) total { 
  return whatEverYouLike; 
}
@end
1 голос
/ 06 мая 2010

Я хочу опубликовать небольшую модификацию ответа Луджи.

@interface Marks :  NSManagedObject  
{
}
@property (nonatomic, retain) NSDecimalNumber * answerGradeA;
@property (nonatomic, retain) NSDecimalNumber * answerGradeB;
@property (nonatomic, retain) NSDecimalNumber * answerGradeC;
@property (nonatomic, readonly) NSDecimalNumber* total;
@end

@implementation Marks (Calculated)
- (NSDecimalNumber*) total { 
return (3 * [self valueForKey:@"answerGradeA"]) + (2 * [self valueForKey:@"answerGradeB"]) + [self valueForKey:@"answerGradeC"]; 
}
+ (NSSet *)keyPathsForValuesAffectingTotal
{
return [NSSet setWithObjects:@"answerGradeA", @"answerGradeB", @"answerGradeC", nil];
}
@end
...