1

オブジェクトを管理するためにコアデータフレームワークを使用しています。10進数タイプのいくつかの属性を持つエンティティがあります。その中には、他の属性から数学的に計算された属性があります。例:

@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

このようにすることが可能なら、どうやって?

4

3 に答える 3

6

Core Dataの方法は、モデルに属性として「total」を追加し、「transient」とマークすることです。次に、サブクラスで実装を提供します。

@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

これにより、合計の適切なキャッシュと更新が保証されます。

于 2010-05-02T14:59:51.210 に答える
2

それをカテゴリにして、別のファイルにコンパイルしてみませんか?(厳密に言えば、合計はCoreDataの一部であってはなりません。)

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

@implementation Marks (Calculated)
- (NSDecimalNumber*) total { 
  return whatEverYouLike; 
}
@end
于 2010-04-30T20:32:20.947 に答える
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
于 2010-05-06T11:30:00.117 に答える