Tengo una NSDate atributo llamado startDate almacenados en el almacén de persistencia en el siguiente formato (imagen de abajo).

iOS: NSPredicate utilizando NSDate para comparar

426174354 = 04 de julio de 2014

Necesito crear (3) NSFetchRequest el uso de predicados.

Para startDate:

  1. fetchRequest1 utilizando el predicado(s) necesidad de obtener todo lo que cae en el día de la fecha, basado en el dispositivo del Usuario tiempo.
  2. fetchRequest2 utilizando el predicado(s) necesidad de obtener todo lo que en el pasado, significado de ayer y de antes, basado en el dispositivo del Usuario tiempo.
  3. fetchRequest3 utilizando el predicado(s) necesidad de obtener todo lo que en el futuro, lo que significa a partir de mañana y después, con base en el dispositivo del Usuario tiempo.

A continuación es el código que tengo hasta ahora:

-(NSMutableArray *)getFetchPredicate:(NSUInteger)fetchRequestType
{
    NSDate *now = [self getcurrentTime:[NSDate date]];
    NSDateFormatter *format = [[NSDateFormatter alloc] init];
    format.dateFormat = @"dd-MM-yyyy";
    format.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
    NSString *stringDate = [format stringFromDate:now];
    NSDate *todaysDate = [format dateFromString:stringDate];
    //today's date is now a date without time. 

    NSMutableArray *subpredicates;

    if (fetchRequestType == 1)
    {
        NSPredicate *subPredToday = [NSPredicate predicateWithFormat:@"startDate == %@ ", todaysDate];
        [subpredicates addObject:subPredToday];
    }
    else if (fetchRequestType == 2)
    {
        NSPredicate *subPredPast = [NSPredicate predicateWithFormat:@"startDate < %@", todaysDate];
        [subpredicates addObject:subPredPast];
    }
    else if (fetchRequestType == 3)
    {
        NSPredicate *subPredFuture = [NSPredicate predicateWithFormat:@"startDate > %@", todaysDate];
        [subpredicates addObject:subPredFuture];
    }
    return subPredicates;
}

-(NSDate *)getcurrentTime:(NSDate*)date
{
    NSDate *sourceDate = date;

    NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
    NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone];

    NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:sourceDate];
    NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate];
    NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset;

    NSDate* deviceDateWithTime = [[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate];
    return deviceDateWithTime;
}

El código anterior no es ir a buscar los objetos adecuados de CoreData. Tengo la sensación de que mi predicados de comparación son incorrectos. No estoy seguro de cómo convertir el tiempo almacenado en startDate a sólo el formato de Fecha y sólo se aplican que, en los Predicados de comparación. Alguna sugerencia?

Ninguno de su recuperación solicitud tipos devuelve resultados correctos?
Nope. Necesito convertir almacena la fecha sólo la Fecha sólo?

OriginalEl autor user1107173 | 2014-07-02

1 Comentario

  1. 17

    Creo que hay algo mal con su noción de todaysDate. AFAIK, NSDate representa un absoluto punto en el tiempo, por lo que su esfuerzo para crear una «Fecha», «sin Tiempo» parece inútil. Y también el uso de NSDateFormatter un conjunto de fechas es inestable.

    Yo creo que hay que crear dos diferentes NSDate objetos: startOfCurrentDay (e.g 00:00:00) y endOfCurrentDay (e.g 23:59:59) y personalmente me gustaría hacerlo mediante el uso de un NSCalendar. Si lo hace, su recuperación solicitud predicados será:

     if (fetchRequestType == 1)
        {
            NSPredicate *subPredToday = [NSPredicate predicateWithFormat:@"(startDate >= %@) AND (startDate <= %@)", startOfCurrentDay, endOfCurrentDay];
        }
        else if (fetchRequestType == 2)
        {
            NSPredicate *subPredPast = [NSPredicate predicateWithFormat:@"startDate < %@", startOfCurrentDay];
        }
        else if (fetchRequestType == 3)
        {
            NSPredicate *subPredFuture = [NSPredicate predicateWithFormat:@"startDate > %@", endOfCurrentDay];
        }
    Esto funcionó muy bien, gracias! La última pregunta: Los valores 426174354 para startDate que está almacenada en el Núcleo central de Datos, ¿cuál es el formato que? Yo no creo que sea en cuestión de segundos, ¿no?
    Que es: es el número de segundos transcurridos desde el primer instante de 1 de enero de 2001, GMT. Usted puede encontrar más en la NSDate de referencia
    Gracias! Tal vez usted también sabe que esto: stackoverflow.com/questions/24556123/…
    Usted puede utilizar ENTRE el lugar de la comprobación de <= y >=..
    Entre la palabra clave no funciona con los datos de los núcleos, se bloquea la aplicación.

    OriginalEl autor spassas

Dejar respuesta

Please enter your comment!
Please enter your name here