title: Calculating the max value for a core data attribute - NSCFNumber error
body: <p>I need to find out the maximum value of an attribute of a core data entity.</p>
  
  <p>I'm still firmly in the Cocoa learning curve, and this is a simple test app that I'm using to learn.</p>
  
  <p>The app imports fortunes from a text file and displays a table on the screen. The imports are done in a separate, background thread.</p>
  
  <p>I found this code online, which I have attempted to get working:</p>
  
  <pre><code>- (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:&amp;error];  // crashes here  
  
      if (objects &amp;&amp; ([objects count] &gt; 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);  
  } 
  </code></pre>
  
  <p>My entity is called "Fortune" and the attribute is called "id" (a Double).</p>
  
  <p>When the code runs it crashes when the fetch request is executed. The console shows this:</p>
  
  <pre>
  2009-12-18 00:53:42.777 FortunesHelperMVC[4027:1703] -[NSCFNumber count]: unrecognized selector sent to instance 0x1004d7b10  
  2009-12-18 00:53:42.778 FortunesHelperMVC[4027:1703] An uncaught exception was raised  
  2009-12-18 00:53:42.778 FortunesHelperMVC[4027:1703] -[NSCFNumber count]: unrecognized selector sent to instance 0x1004d7b10  
  2009-12-18 00:53:42.779 FortunesHelperMVC[4027:1703] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSCFNumber count]: unrecognized selector sent to instance 0x1004d7b10'  
  *** Call stack at first throw:  
  (
  0 CoreFoundation 0x00007fff83ed9444 __exceptionPreprocess + 180  
  1 libobjc.A.dylib 0x00007fff85fbb0f3 objc_exception_throw + 45  
  2 CoreFoundation 0x00007fff83f321c0 +[NSObject(NSObject) doesNotRecognizeSelector:] + 0  
  3 CoreFoundation 0x00007fff83eac08f ___forwarding___ + 751  
  4 CoreFoundation 0x00007fff83ea81d8 _CF_forwarding_prep_0 + 232  
  5 Foundation 0x00007fff88a5609e +[_NSPredicateUtilities max:] + 46  
  6 Foundation 0x00007fff8893ce72 -[NSFunctionExpression expressionValueWithObject:context:] + 530  
  7 CoreData 0x00007fff8613b5b1 -[NSMappedObjectStore executeFetchRequest:withContext:] + 2081  
  8 CoreData 0x00007fff8613ad10 -[NSMappedObjectStore executeRequest:withContext:] + 80  
  9 CoreData 0x00007fff86108900 -[NSPersistentStoreCoordinator(_NSInternalMethods) executeRequest:withContext:] + 688  
  10 CoreData 0x00007fff8610621b -[NSManagedObjectContext executeFetchRequest:error:] + 267  
  11 FortunesHelperMVC 0x0000000100001d9d -[ImportOperation getMaxID] + 572  
  12 FortunesHelperMVC 0x0000000100001f95 -[ImportOperation main] + 330  
  13 Foundation 0x00007fff888f406d -[__NSOperationInternal start] + 681  
  14 Foundation 0x00007fff888f3d23 ____startOperations_block_invoke_2 + 99  
  15 libSystem.B.dylib 0x00007fff86a98ce8 _dispatch_call_block_and_release + 15  
  16 libSystem.B.dylib 0x00007fff86a77279 _dispatch_worker_thread2 + 231  
  17 libSystem.B.dylib 0x00007fff86a76bb8 _pthread_wqthread + 353  
  18 libSystem.B.dylib 0x00007fff86a76a55 start_wqthread + 13  
  )  
  terminate called after throwing an instance of 'NSException'  
  </pre>
  
  <p>Any ideas why this isn't working? I'm stumped after a lot of Googling.</p>
  
  <p>Thanks</p>
  
  <p>Darren.</p>