Простой и надежный способ получить максимальное значение атрибута основного объекта данных? - PullRequest
4 голосов
/ 07 июня 2011

Есть ли простой (или просто надежный) способ найти максимальное значение основного атрибута данных?Пример от Apple просто не работает (плюс он до смешного длинен и сложен для такой простой задачи).Я провел почти день на этом и не смог найти удовлетворительного ответа.Пожалуйста, помогите!

Я получаю ту же ошибку, что и в этом вопросе: - [NSCFNumber count]: нераспознанный селектор .Как и он, я не смог найти решение проблемы.

Этот спрашивающий думает, что он решил ту же проблему, но, как и кто-то другой прокомментировал, ответ здесь явно неправильный.

Этот вопрос также имеет проблемы с точно таким же кодом, но, по крайней мере, спрашивающий фактически не получил исключения.Похоже, что он не мог заставить его работать должным образом, и в итоге использовал другое решение, но не сказал, что.

Один человек здесь обошел его, получив отсортированные результаты ииспользуя верхнее значение.Не идеально!Однако, если я не могу найти решение в ближайшее время, я думаю, что мне придется сделать то же самое, или реструктурировать мою модель или бизнес-правила, или создать и поддерживать класс MaxValue в моей модели, чтобы обойти это ...

Ответы [ 2 ]

3 голосов
/ 12 июня 2011

Я нашел это в руководстве по программированию основных данных при получении определенных значений. Это относится к минимуму, но отвечает на ваш вопрос. Не так просто, как можно было бы надеяться, но не так сложно следовать.

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];
0 голосов
/ 07 июня 2011

имеет подкласс NSManagedObject с именем TestEntity, который имеет одно двойное свойство с именем 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);
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...