我需要找出核心数据实体的属性的最大值。
我仍然牢牢地掌握了可可的学习曲线,这是一个简单的测试应用程序,我正在使用它来学习。
该应用程序从文本文件中导入财富,并在屏幕上显示一个表格。导入在单独的后台线程中完成。
我在网上找到了这段代码,我试图让它生效:

- (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/

10-13 02:38