正在关注a fantastic tutorial by Jeff Lamarche,我试图为NSManagedObject
的特定子类汇总数据。使用CoreData执行乘法(聚合):如何?
这是场景。我创建了一个名为Product
的类,它扩展了NSManagedObject
类。 Product
类有三个属性,如下列:
@property (nonatomic, retain) NSString* name;
@property (nonatomic, retain) NSNumber* quantity;
@property (nonatomic, retain) NSNumber* price;
我还创建了一个类别,被称为Product+Aggregate
,我在那里执行和聚集。特别是,按照Jeff的教程,我管理数量属性的总和。
+(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按预期。
现在我会再来一步。修改该方法,我需要返回产品订单的总成本。换句话说,我需要为每个产品计算QUANTITY * PRICE值,最后返回TOTAL。
你能告诉我正确的方法吗?先谢谢你。
编辑这是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'终止应用程序,原因:'更新时出错'约束失败''Can你把一个完整的堆栈跟踪pastie? – Cyberfox
是的,我做了。stacktrace呈现异常。我可以做一些事情看到一个完整的堆栈跟踪?我的方案项目中启用日志异常 –