2014-07-02 25 views
9

Ho un attributo NSDate chiamato startDate memorizzato nell'archivio di persistenza nel seguente formato (immagine sotto).iOS: NSPredicate usando NSDate per confrontare

enter image description here

426.174.354 = 4 luglio 2014

Ho bisogno di creare (3) NSFetchRequest usando predicati.

Per startDate:

  1. fetchRequest1 utilizzando predicato (s) necessario per andare a prendere tutto ciò che cade in data odierna in base al tempo dispositivo dell'utente.
  2. fetchRequest2 utilizzando i predicati è necessario recuperare tutto ciò che è nel passato, ovvero ieri e prima, in base al tempo del dispositivo dell'utente.
  3. fetchRequest3 utilizzando i predicati è necessario recuperare tutto ciò che è in futuro, ovvero a partire da domani e in seguito, in base al tempo del dispositivo dell'utente.

Di seguito è il codice che ho finora:

-(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; 
} 

Il codice di cui sopra non è andare a prendere gli oggetti giusti da CoreData. Ho la sensazione che i miei pronostici per il confronto non siano corretti. Non sono sicuro di come convertire il tempo memorizzato in startDate solo in formato data e applicarlo nei predicati per il confronto. Eventuali suggerimenti?

+0

Nessuno dei tipi di richiesta di recupero restituisce risultati corretti? – spassas

+0

No. Devo convertire la data memorizzata solo in data? – user1107173

risposta

16

Penso che ci sia qualcosa di sbagliato nella nozione di todaysDate. AFAIK, NSDate rappresenta un punto assoluto nel tempo, quindi il tuo sforzo di creare una "Data" senza "Tempo" sembra inutile. E anche l'uso di NSDateFormatter per impostare le date è traballante.

penso che è necessario creare due differenti NSDate oggetti: startOfCurrentDay (per esempio 00:00:00) e endOfCurrentDay (per esempio 23:59:59) e personalmente lo farei utilizzando un NSCalendar. In tal caso, i predicati delle richieste di recupero saranno:

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]; 
    } 
+0

Questo ha funzionato alla grande, grazie! Ultima domanda: I valori '426174354' per' startDate' che sono memorizzati in Core Data, in che formato si trova? Non penso che sia in secondi, vero? – user1107173

+1

In realtà è: è il numero di secondi trascorsi dal primo istante del 1 gennaio 2001, GMT. Puoi trovare ulteriori informazioni nel [Riferimento NSDate] (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/Reference/Reference.html) – spassas

+0

Grazie! Forse conosci anche questo: http://stackoverflow.com/questions/24556123/nsfetchedresultscontroller-multiple-frcs-delegate-error-when-updating – user1107173