通过核心数据计算十进制值的总和不能正常工作?
Posted
技术标签:
【中文标题】通过核心数据计算十进制值的总和不能正常工作?【英文标题】:Calculating sum for decimal values via Core Data not working properly? 【发布时间】:2009-11-08 14:39:17 【问题描述】:我是第一次在本轮发帖,如果我没有正确遵守所有规则,请多多包涵。
我正在为 iPhone (OS 3.1) 编写一个应用程序,并尝试编写一些代码来添加小数。我有一个名为 SimpleItem 的核心数据实体,它有一个数量属性。这是我写的测试用例:
// Create and configure objects
SimpleItem *si1 = [self createSimpleItem:@"si1"];
si1.amount = [NSDecimalNumber decimalNumberWithMantissa:1000 exponent:0 isNegative:NO];
SimpleItem *si2 = [self createSimpleItem:@"s12"];
si2.amount = [NSDecimalNumber decimalNumberWithMantissa:2000 exponent:0 isNegative:NO];
// Need to save prior to fetching results with NSDictionaryResultType (known limitation)
[self save];
// Describe fetch request
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"SimpleItem" inManagedObjectContext:self.context];
[request setEntity:entityDescription];
[request setResultType:NSDictionaryResultType];
NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"amount"];
// For whatever reason, evaluating this expression here is absolutely not working. Probably decimals aren't handled properly.
NSExpression *sumAmountExpression = [NSExpression
expressionForFunction:@"max:"
arguments:[NSArray arrayWithObject:keyPathExpression]];
NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];
[expressionDescription setName:@"amount"];
[expressionDescription setExpression:sumAmountExpression];
[expressionDescription setExpressionResultType:NSDecimalAttributeType];
[request setPropertiesToFetch:[NSArray arrayWithObject:expressionDescription]];
// Fetch the amounts
NSError *error = nil;
NSArray *array = [self.context executeFetchRequest:request error:&error];
如果我通过 otest 执行此代码并对其进行调试,则在执行 fetch 请求时会出现异常:“-[NSDecimalNumber count]: unrecognized selector sent to instance.”
不过,仅在没有聚合函数的情况下评估 keyPathExpression 可以正常工作。
reference documentation 显示了完全相同的示例,所以我想知道我做错了什么。或者这可能只是一个错误?
一切顺利, 哈拉尔
【问题讨论】:
我也遇到过这个;认为这是 Core Data 中的一个错误,因为它在 SQL 存储中有效,但在内存中无效。当我有机会时,我将把它提交给雷达。 【参考方案1】:将您给定的源代码复制到一个新的 iPhone 项目并在模拟器中运行它在这里工作正常。我在 Snow Leopard 上针对 3.1.2 SDK 进行编译。
这是我用于数据模型的:
model description http://homepage.mac.com/aclark78/.Public/Pictures/test%20model.png
一定有其他原因导致您的问题。您能否描述一下您的模型或进一步简化它?
【讨论】:
查看我对原始问题的评论;我使用的是 SQL 存储?【参考方案2】:我想我以前遇到过这个问题。 IIRC,问题是您已将 您的获取结果类型设置为文档中的所有示例都使用默认的NSDictionaryResultType
,但您在NSArray
中接收它。尝试将获取结果类型切换为NSManagedObjectResultType
,它会返回一个数组。 NSManagedObjectResultType
。
在任何情况下,错误消息显然是由 NSDecimal 对象发送数组的count
消息引起的。您可以通过在id
中捕获结果来确认这一点。例如:
id *genericObj = [self.context executeFetchRequest:request error:&error];
NSLog("returned object=%@",genericObj);
NSLog("returned object class=%@",[genericObj class]);
【讨论】:
指定NSDictionaryResultType
时,您将通过executeFetchRequest:error:
收到一个包含一个对象的数组。
这就是我从记忆中获得的结果。【参考方案3】:
感谢您告诉我。问题是我实际上不想使用托管对象。毕竟,我只对数量感兴趣,这就是我从字典中得到的。
此外,尝试调查您描述的问题并没有奏效,因为执行获取请求立即失败,我没有得到任何回报。
还有其他想法吗?是否有任何其他可能获得汇总值?任何“最佳实践”?目前我执行以下操作(继续上面的代码):
NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init]; [表达式描述 setName:@"amount"]; [表达式描述 setExpression:keyPathExpression]; [表达式描述 setExpressionResultType:NSDecimalAttributeType]; [请求 setPropertiesToFetch:[NSArray arrayWithObject:expressionDescription]];
// Fetch the amounts
NSError *error = nil;
NSArray *array = [self.context executeFetchRequest:request error:&error];
if (array == nil)
STFail(@"Fetch request could not be completed: %@", [error localizedDescription]);
STAssertEquals([array count], (NSUInteger) 2, @"Number of fetched objects != 2");
// Manually calculate the sum
NSDecimalNumber *sum = nil;
for (NSDictionary * dictionary in array)
NSDecimalNumber *amount = (NSDecimalNumber *) [dictionary valueForKey:@"amount"];
if (!sum)
sum = amount;
else
sum = [sum decimalNumberByAdding:amount];
STAssertNotNil(sum, @"Sum is nil");
STAssertTrue([sum isEqualToNumber:[NSDecimalNumber decimalNumberWithMantissa:3000 exponent:0 isNegative:NO]],
@"Sum != 3000: %@", sum);
问候, 哈拉尔
【讨论】:
嗨,Harald,请不要将您的回复发布为对您问题的回答。相反,您应该使用“添加评论”功能直接回复答案/cmets,并在您找到问题时使用其他信息编辑您的问题。 您需要一定的声誉才能发表评论,虽然更新原始问题没问题...只需添加一个包含更新信息的新部分,这样您仍然可以看到原始问题以上是关于通过核心数据计算十进制值的总和不能正常工作?的主要内容,如果未能解决你的问题,请参考以下文章
php求余运算结果,反推出来之前的数据。比如x%69返回结果是584,x怎么才能推出来结果?
如何在PHP-jQuery中的DataTables中显示列的总和(其中所有值都是十进制值)?