2010-05-10 10 views
7

Estoy tratando de encontrar la fecha más antigua en un atributo particular en Datos centrales. He encontrado an example in the Core Data Programming Guide que pretende hacer exactamente eso, pero sigo obteniendo un error seleccionado no reconocido cuando lo ejecuto.Datos principales: tratando de encontrar la fecha mínima para un atributo en una entidad

Mi código (con sólo cambios mínimos del Ejemplo de Apple):

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Session" inManagedObjectContext: ctx]; 
[request setEntity:entity]; 

// Specify that the request should return dictionaries. 
[request setResultType:NSDictionaryResultType]; 

// Create an expression for the key path. 
NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"startedAt"]; 

// 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; 
NSArray *objects = [ctx executeFetchRequest:request error:&error]; 

y el error:

-[NSCalendarDate count]: unrecognized selector sent to instance ... 

lo cual es extraño teniendo en cuenta que 1) NSCalendarDate es obsoleto y 2) I' Definitivamente no estoy llamando a contar.

¡Cualquier ayuda sería muy apreciada!

+0

¿Está "startedAt" definido como NSDate? y está indexado. He usado casi el código exacto para ti y funciona muy bien. Creo que es mejor que usar un tipo –

Respuesta

12

¿Por qué no acaba de agregar un descriptor de ordenación para ordenar por startedDate ascendente, y luego solo hacer que la solicitud de búsqueda devuelva 1 objeto?

+0

Bueno, obviamente porque no estaba pensando ... :-) Eso funciona. ¡Gracias! – AndrewO

+0

Eso es ... muy inteligente. Aplausos. – duci9y

+0

Creo que usar una expresión sobre un género sería más eficiente. –

0

Este es mi código que funciona. No veo ninguna diferencia significativa en su propio código y tal vez esté en la definición del modelo de datos básicos. Asegúrese de que su fecha sea NSDate y esté indexada.

- (NSDate *)lastSync:(PHAssetMediaType)mediaType { 
    NSEntityDescription *entity = [NSEntityDescription entityForName:kMediaItemEntity inManagedObjectContext:self.managedObjectContext]; 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    fetchRequest.entity = entity; 
    fetchRequest.resultType = NSDictionaryResultType; 

    NSMutableArray *predicates = [NSMutableArray array]; 
    [predicates addObject:[NSPredicate predicateWithFormat:@"%K=%d", kMediaType,mediaType]]; 
    [predicates addObject:[NSPredicate predicateWithFormat:@"%K=%d", kMediaProviderType,self.mediaProviderType]]; 
    NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates: predicates]; 
    fetchRequest.predicate = predicate; 

    // Create an expression for the key path. 

    NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:kSyncTime]; 
    // Create an expression to represent the function you want to apply 

    NSExpression *maxExpression = [NSExpression expressionForFunction:@"max:" 
                  arguments:@[keyPathExpression]]; 

    // Create an expression description using the maxExpression and returning a date. 
    NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init]; 
    [expressionDescription setName:@"maxDate"]; 
    [expressionDescription setExpression:maxExpression]; 
    [expressionDescription setExpressionResultType:NSDateAttributeType]; 

    // Set the request's properties to fetch just the property represented by the expressions. 
    fetchRequest.propertiesToFetch = @[expressionDescription] ; // @[kSyncTime]; 

    NSError *fetchError = nil; 
    id requestedValue = nil; 

    // fetch stored media 
    NSArray *results = [self.managedObjectContext executeFetchRequest:fetchRequest error:&fetchError]; 
    if (fetchError || results == nil || results.count == 0) { 
     return [NSDate dateWithTimeIntervalSince1970:0]; 
    } 
    requestedValue = [[results objectAtIndex:0] valueForKey:@"maxDate"]; 
    if (![requestedValue isKindOfClass:[NSDate class]]) { 
     return [NSDate dateWithTimeIntervalSince1970:0]; 
    } 
    DDLogDebug(@"sync date %@",requestedValue); 
    return (NSDate *)requestedValue; 
} 
Cuestiones relacionadas