a fantastic tutorial by Jeff Lamarcheに続いて、NSManagedObject
という特定のサブクラスのデータを集計しようとしています。CoreDataで乗算(集計)を実行するにはどうすればよいですか?
これはシナリオです。 NSManagedObject
クラスを拡張するProduct
という名前のクラスを作成しました。 Product
クラスは、次のような3つのプロパティました:
@property (nonatomic, retain) NSString* name;
@property (nonatomic, retain) NSNumber* quantity;
@property (nonatomic, retain) NSNumber* price;
また、私は和集約を行うProduct+Aggregate
というカテゴリを作成しました。特に、Jeffのチュートリアルに続いて、私はquantity属性の合計を管理しました。
+(NSNumber *)aggregateOperation:(NSString *)function onAttribute:(NSString *)attributeName withPredicate:(NSPredicate *)predicate inManagedObjectContext:(NSManagedObjectContext *)context
{
NSString* className = NSStringFromClass([self class]);
NSExpression *ex = [NSExpression expressionForFunction:function
arguments:[NSArray arrayWithObject:[NSExpression expressionForKeyPath:attributeName]]];
NSExpressionDescription *ed = [[NSExpressionDescription alloc] init];
[ed setName:@"result"];
[ed setExpression:ex];
[ed setExpressionResultType:NSInteger64AttributeType];
NSArray *properties = [NSArray arrayWithObject:ed];
[ed release];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setPropertiesToFetch:properties];
[request setResultType:NSDictionaryResultType];
if (predicate != nil)
[request setPredicate:predicate];
NSEntityDescription *entity = [NSEntityDescription entityForName:className
inManagedObjectContext:context];
[request setEntity:entity];
NSArray *results = [context executeFetchRequest:request error:nil];
NSDictionary *resultsDictionary = [results objectAtIndex:0];
NSNumber *resultValue = [resultsDictionary objectForKey:@"result"];
return resultValue;
}
特定UIViewController
から続くこのクラスのメソッドが呼び出されます。
NSNumber *totalQuantity = [Product aggregateOperation:@"sum:" onAttribute:@"quantity" withPredicate:nil inManagedObjectContext:self.context];
コードがうまく動作します。実際には、私が持っている場合に予想されるとして、3製品
NAME QUANTITY PRICE
PRODUCT 1 2 23.00
PRODUCT 2 4 12.00
PRODUCT 3 1 2.00
aggregateOperation
メソッドは7を返すと言います。
もう1歩進んでいます。その方法を変更すると、私は製品注文の総コストを返す必要があります。つまり、商品ごとにQUANTITY * PRICEの値を計算し、最後にTOTALを返す必要があります。
私に正しい方法を教えてください。前もって感謝します。
EDITこれはCyberfoxの提案後に使用する新しいコードですが、残念ながらうまくいきません。
NSString* className = NSStringFromClass([self class]);
NSArray *quantityPrice = [NSArray arrayWithObjects: [NSExpression expressionForKeyPath:@"quantity"], [NSExpression expressionForKeyPath:@"price"], nil];
NSArray *multiplyExpression = [NSArray arrayWithObject:[NSExpression expressionForFunction:@"multiply:by:" arguments:quantityPrice]];
NSExpression *ex = [NSExpression expressionForFunction:function arguments:multiplyExpression];
NSExpressionDescription *ed = [[NSExpressionDescription alloc] init];
[ed setName:@"result"];
[ed setExpression:ex];
[ed setExpressionResultType:NSInteger64AttributeType];
// same as before
ご回答いただきありがとうございます。それを実行すると、コードはNSArray * results = [context executeFetchRequest:request error:nil];で終了します。例外は次のとおりです。** EXCEPTIONS:フレームから巻き戻す**任意の提案ですか? –
編集したバージョンを取得しましたか? ':'を 'multiply:by:'式に追加しましたか? StackOverflowは私に約10分間それを修正する手間を与えていました。 :( スタックトレースのどこかに、より包括的なエラーがあるはずです。「キャッチされていない例外によるアプリケーションの終了」NSInternalInconsistencyException、理由: '更新中にエラーが発生しました。 – Cyberfox
はい、スタックトレースはその例外を表示します。完全なスタックトレースを表示するために何かできますか?スキームプロジェクトで例外ログが有効になっています。 –