获取核心数据对象属性的最大值的简单可靠方法?

时间:2011-06-07 05:16:48

标签: objective-c cocoa macos core-data

是否有一种简单(或可靠)的方法来查找核心数据属性的最大值? Apple的example只是不起作用(加上它对于这么简单的任务来说是漫长而复杂的)。我花了差不多一天的时间才找到满意的答案。请帮忙!

我收到与此问题相同的错误:-[NSCFNumber count]: unrecognized selector。像他一样,我无法找到问题的解决方案。

这位提问者认为他解决了同样的问题但是,就像其他人评论的那样,这里的答案显然是错误的。

这个question在完全相同的代码中也有问题,但至少提问者实际上没有得到异常。看起来他无法让它正常工作,最终使用了不同的解决方案,但没有说出什么。

一个人here通过检索已排序并使用最高值的结果来绕过它。不太理想!但是,如果我很快找不到解决方案,我想我将不得不这样做,或者重构我的模型或业务规则,或者在我的模型中创建和维护MaxValue类来解决这个问题...

2 个答案:

答案 0 :(得分:3)

我在核心数据编程指南中找到了获取特定值的内容。它指的是最低限度,但它可以回答您的问题。并不像人们希望的那么容易,但并不难以理解。

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:context];
[request setEntity:entity];
// Specify that the request should return dictionaries.
[request setResultType:NSDictionaryResultType];
// Create an expression for the key path.
NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"creationDate"];
// Create an expression to represent the minimum value at the key path 'creationDate'
NSExpression *minExpression = [NSExpression expressionForFunction:@"min:" arguments:[NSArray  arrayWithObject:keyPathExpression]];
// Create an expression description using the minExpression and returning a date.
NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];
// The name is the key that will be used in the dictionary for the return value.     

[expressionDescription setName:@"minDate"];
[expressionDescription setExpression:minExpression];
[expressionDescription setExpressionResultType:NSDateAttributeType];
// Set the request's properties to fetch just the property represented by the expressions.
[request setPropertiesToFetch:[NSArray arrayWithObject:expressionDescription]];
// Execute the fetch.
NSError *error = nil;
NSArray *objects = [managedObjectContext executeFetchRequest:request error:&error];
if (objects == nil) {
    // Handle the error
}
else {
    if ([objects count] > 0) {
        NSLog(@"Minimum date: %@", [[objects objectAtIndex:0] valueForKey:@"minDate"]);
    }
}



[expressionDescription release];

[request release];

答案 1 :(得分:0)

有一个名为TestEntity的NSManagedObject子类,它有一个名为tesetID的双重属性。

-(double)getNextIndex
{
    NSFetchRequest * request = [[NSFetchRequest alloc] init];
    [request setEntity:[NSEntityDescription entityForName:@"TestEntity" inManagedObjectContext:self.managedObjectContext]];
    NSError * err = nil;
    NSArray * array = [self.managedObjectContext executeFetchRequest:request error:&err];
    NSNumber * value = [array valueForKeyPath:@"@max.testID"];

    return [value doubleValue]+1;
}
-(void)test
{
 for (int i = 0; i<25 ; i++) {
        TestEntity * entity = [[TestEntity alloc] initWithEntity:[NSEntityDescription entityForName:@"TestEntity" inManagedObjectContext:self.managedObjectContext] insertIntoManagedObjectContext:self.managedObjectContext];
        entity.testID = [NSNumber numberWithDouble:[self getNextIndex]];
        NSLog(@"our testID is set as: %@",entity.testID);
    }

}