我需要找出核心数据实体的属性的最大值。
我仍然牢牢地掌握了可可的学习曲线,这是一个简单的测试应用程序,我正在使用它来学习。
该应用程序从文本文件中导入财富,并在屏幕上显示一个表格。导入在单独的后台线程中完成。
我在网上找到了这段代码,我试图让它生效:
- (double)getMaxID
{
NSLog(@"in getMaxID"); // debug
// Use a new moc with the original persistentStoreCoordinator to ensure thread safety
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] init];
[moc setPersistentStoreCoordinator:[[self delegate] persistentStoreCoordinator]];
// Create fetch
NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
[fetch setEntity:[NSEntityDescription entityForName:@"Fortune" inManagedObjectContext:moc]];
[fetch setResultType:NSDictionaryResultType];
// Expression for Max ID
NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"id"];
NSExpression *minExpression = [NSExpression expressionForFunction:@"max:" arguments: [NSArray arrayWithObject:keyPathExpression]];
NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];
[expressionDescription setName:@"maxID"];
[expressionDescription setExpression:minExpression];
[expressionDescription setExpressionResultType:NSDoubleAttributeType];
[fetch setPropertiesToFetch:[NSArray arrayWithObject:expressionDescription]];
// Execute the fetch.
double theID = 0;
NSError *error = nil;
NSArray *objects = nil;
objects = [moc executeFetchRequest:fetch error:&error]; // crashes here
if (objects && ([objects count] > 0))
{
NSLog(@"query successful"); // debug
theID = [((NSNumber *)[[objects objectAtIndex:0] valueForKey:@"maxID"]) doubleValue];
}
else
{
NSLog(@"Setting default value for theID"); // debug
theID = 0;
}
return(theID);
}
我的实体名为“fortune”,属性名为“id”(double)。
当代码运行时,当执行读取请求时崩溃。控制台显示如下:
2009-12-18 00:53:42.777 fortuneshelpermvc[4027:1703]-[nscfnumber count]:发送到实例0x1004d7b10的未识别选择器
2009年12月18日00:53:42.778 FortuneselPermvc[4027:1703]出现意外异常
2009-12-18 00:53:42.778 fortuneshelpermvc[4027:1703]-[nscfnumber count]:发送到实例0x1004d7b10的未识别选择器
2009-12-18 00:53:42.779 FortuneShelPermVC[4027:1703]***由于未捕获的异常而终止应用程序“nsInvalidArgumentException”,原因:'-[nscfNumber Count]:发送到实例0x1004D7B10的未识别选择器
***第一次抛出时调用堆栈:
(
0 Copeoundation 0x000,7FFF83ED944 4,例外预处理+ 180
1 LIBOBJC.A.DYLIB 0x000 7FFF85 FB00F3 ObjcRealPosithPox+ 45
2 corefoundation 0x00007fff83f321c0+[nsobject(nsobject)不重新识别选择器:]+0
3 CoreFoundation 0x00007FFF83EAC08F转发+751
4 corefoundation 0x00007fff83ea81d8_cf_转发_prep_0+232
5基础0x00007FFF88A5609E+[\u预测实用程序最大值:]+46
6基础0x00007fff8893ce72-[nsFunctionExpression ExpressionValueWithObject:上下文:]+530
7核心数据0x00007fff8613b5b1-[nsmappedpobjectstore executefetchrequest:withcontext:]+2081
8核心数据0x00007fff8613ad10-[nsmappedpobjectstore executequest:withcontext:]+80
9核心数据0x00007fff86108900-[nsPersistentStoreCoordinator(\u nsInternalMethods)执行程序请求:WithContext:]+688
10核心数据0x00007fff8610621b-[nsmanagedobjectcontext executefetchrequest:错误:]+267
11财富管理0x0000000100001d9d-[导入操作getmaxid]+572
12福星高照0x0000000100001f95-[进口主营]+330
13基础0x00007FFF888F406D-[\u运行内部启动]+681
14基础0x00007FFF888F3D23\uuuuuuuuu StartOperations\u Block\u Invoke\u 2+99
15 libsystem.b.dylib 0x00007fff86a98ce8调度调用块和释放+15
16 libsystem.b.dylib 0x00007fff86a77279调度工人线程2+231
17 libsystem.b.dylib 0x00007fff86a76bb8线程+353
18 libsystem.b.dylib 0x00007fff86a76a55启动线程+13
)
引发“nsexception”实例后调用terminate
你知道为什么这样不行吗?我在网上搜了很多东西,都被难住了。
谢谢
达伦。
最佳答案
我不得不解决一个类似的问题,并以稍微不同的方式处理它:
查询实体
按所需属性排序
将提取结果限制为1
代码如下。我正在查询一个名为“entityname”的实体并检索属性“sequenceid”的最大值。
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *res = [NSEntityDescription entityForName:@"entityName" inManagedObjectContext:managedObjectContext];
[request setEntity:res];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"sequenceId" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];
[sortDescriptors release];
[sortDescriptor release];
[request setFetchLimit:1];
NSError *error = nil;
NSArray *results = [managedObjectContext executeFetchRequest:request error:&error];
[request release];
if (results == nil) {
NSLog(@"error fetching the results: %@",error);
}
NSInteger maximumValue = 0;
if (results.count == 1) {
Result *result = (Result*)[results objectAtIndex:0];
maximumValue = [result.sequenceId integerValue];
}
关于objective-c - 计算核心数据属性的最大值-NSCFNumber错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1927981/