8

Estoy usando NSFetchedResultsController y UITableViewController para llenar una UITableView desde una base de datos CoreData.NSPredicate y CoreData: decida si un atributo de fecha es "hoy" (o entre la última noche de 12:00 a 12:00) en iOS

Tengo un objeto NSDate guardado en este atributo de fecha etiquetado como "startTime". Entonces estoy tratando sólo para extraer datos de las de hoy mediante el uso de un NSPredicate que tiene este aspecto:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"startDate == %@", 
          todaysDate]; 

estoy recibiendo cero resultados. Entiendo esto porque un objeto NSDate solo contiene la cantidad de segundos o milisegundos o lo que sea desde el 1 de enero de 1970, ¿verdad? Entonces, al comparar 1111111111111 y 1111111111112, mientras que en el mismo día, hay dos objetos diferentes NSDate que no son iguales.

Entonces, ¿cómo podría formatearse el NSPredicate para que lo hiciera? Voy a adivinar que está creando dos objetos NSDate: uno que está a las 12 a.m. de anoche y otro a las 12 a.m. esta noche y compara startDate y ve si está entre estos dos NSDate s.

Soy algo nuevo en NSPredicate, entonces, ¿cómo podría lograrse esto?

+0

Debe poner su solución en una respuesta en lugar de ponerlo dentro de la pregunta. – yuji

+0

No puedo @yuji porque aún no tengo suficiente representante. –

+0

Quizás podría poner ** su ** solución en una respuesta. Mientras tanto, lo he editado viendo que ya has aceptado la respuesta de yuji. Puede recuperar su solución al ver el historial de revisión. Gracias. – Kev

Respuesta

24

Use NSCompoundPredicate.

NSPredicate *firstPredicate = [NSPredicate predicateWithFormat:@"startDate > %@", firstDate]; 
NSPredicate *secondPredicate = [NSPredicate predicateWithFormat:@"startDate < %@", secondDate]; 

NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:firstPredicate, secondPredicate, nil]]; 

Dónde firstDate es 12 a.m. esta mañana y es secondDate 12 a.m. esta noche.

P.S. Aquí es cómo conseguir 12 a.m. esta mañana:

NSCalendar *calendar = [NSCalendar calendar]; // gets default calendar 
NSCalendarComponents *components = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:[NSDate date]]; // gets the year, month, and day for today's date 
NSDate *firstDate = [calendar dateFromComponents:components]; // makes a new NSDate keeping only the year, month, and day 

12 a.m. Para obtener esta noche, cambiar components.day.

+1

Muchas gracias - par de pequeños errores tipográficos - y predefinidos con subtítulos (P minúscula) y el uso de NSDateComponents en lugar de NSCalendarComponents – amergin

Cuestiones relacionadas