2010-04-30 4 views
1

핵심 데이터 프레임 워크를 사용하여 개체를 관리하고 있습니다. decimal 형식의 여러 속성이있는 엔터티가 있습니다. 그 중에는 다른 속성으로부터 수학적으로 계산되는 속성이 있습니다. 예 :다른 속성에서 계산 된 NSManagedObject의 사용자 지정 특성을 어떻게 설정할 수 있습니까?

여기서 원하는 속성은 total = 3xanswerGradeA + 2xanswerGradeB + 1xanswerGradeC입니다.

이렇게 할 수 있다면 어떻게 할 수 있습니까?

답변

6

코어 데이터 방법은 모델에 attribue로서 '전체'를 추가하고 '과도'를 표시한다. 그런 다음 구현을 하위 클래스에 제공합니다.

@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 

이렇게하면 합계가 적절하게 캐싱되고 업데이트됩니다.

+0

코어 데이터는 속성에 동적으로 값을 할당하기 때문에이 속성이 키 "answerGradeA"의 값인 지 알 수 있도록이 헤더 파일에 remaning 속성 [ "answerGradeA"등]을 "total"과 함께 선언 할 필요가 없습니다. 컴퓨팅하는 동안. –

+0

아니요, 행복하게 컴파일러는 스스로 알아 내려고 충분히 똑똑합니다. 게다가 프로그래머가 쓰는 모든 라인은 잠재적 인 문제와 버그의 근원입니다. '더 적습니다'는 프로그래밍에서와 마찬가지로 실제와 같습니다. 핵심 데이터가 그 일을하고 필요한 경우 올바른 방향으로 만 이동하도록하십시오. –

2

왜 카테고리를 만들어 별도의 파일로 컴파일하지 않습니까? (엄밀히 말하면, 총 CoreData의 일부이어야한다.)

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

@implementation Marks (Calculated) 
- (NSDecimalNumber*) total { 
    return whatEverYouLike; 
} 
@end 
+0

+1 : 데이터 모델을 변경하고 새로운 엔티티 헤더 및 구현 파일을 만들면 카테고리가 분리되지 않고 그대로 유지되므로 카테고리를 사용하는 것이 이상적입니다. –

+0

코어 데이터 모델의 일부가 아닌 이유는 무엇입니까? @Kundan은 여기에 총계를 세 가지 특정 속성의 합으로 정의합니다. @Kundan이 소스 코드에 액세스하지 않는 한 Marks가 전체 구현을 제공하지 않아야하는 이유를 알기가 어렵습니다. –

+0

그것은 총계로 무엇을 할 것인지에 달려 있습니다. 추가 처리, 쿼리, 실행 취소 ... 'total'을 원한다면 일시적인 속성을 사용하는 방식이 효과적입니다 (일시적인 속성이 까다로울 수 있음에도 불구하고). 3 개의 숫자를 추가하는 것만이라면, 아마도 그 모델을 변경하지 않을 것입니다. – Jens

1

나는 Looji의 답변에 약간의 수정 사항을 게시하고 싶다.

@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 
관련 문제