2014-07-02 28 views
9

Mam atrybut o nazwie startDate przechowywany w magazynie trwałości w następującym formacie (obrazek poniżej).iOS: NSPredicate za pomocą NSDate do porównania

enter image description here

426174354 = 04 lipiec 2014

muszę utworzyć (3) NSFetchRequest pomocą predykatów.

Dla startDate:

  1. fetchRequest1 stosując predykat (ów) trzeba pobrać wszystko, co mieści się w dniu dzisiejszym na podstawie czasu urządzenie użytkownika.
  2. fetchRequest2 za pomocą predykatów należy pobrać wszystko, co było w przeszłości, co oznacza wczoraj i wcześniej, w oparciu o czas urządzenia użytkownika.
  3. fetchRequest3 przy użyciu predykatów należy pobrać wszystko, co będzie w przyszłości, czyli zacząć jutro i później, w zależności od czasu urządzenia użytkownika.

Poniżej znajduje się kod mam tak daleko:

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

Powyższy kod nie jest pobieranie odpowiednich obiektów z CoreData. Mam przeczucie, że moje predykaty do porównań są nieprawidłowe. Nie wiem, jak przekonwertować przechowywany czas w startDate tylko do formatu tylko daty i zastosować to w Predykatach dla porównania. Jakieś sugestie?

+0

Żaden z Twoich typów żądań pobierania nie zwraca poprawnych wyników? – spassas

+0

Nie. Czy muszę przekonwertować zapisaną datę tylko na datę? – user1107173

Odpowiedz

16

Myślę, że coś jest nie tak z twoim pojęciem: todaysDate. AFAIK, NSDate reprezentuje absolutny punkt w czasie, więc twoje wysiłki stworzenia "Daty" bez "Czasu" wydają się daremne. Również używanie NSDateFormatter do ustawiania dat jest drżące.

myślę, że trzeba utworzyć dwa różne NSDate obiekty: startOfCurrentDay (np 00:00:00) i endOfCurrentDay (np 23:59:59) i osobiście chciałbym zrobić to przy użyciu NSCalendar. Jeśli to zrobisz, predykaty żądania pobierania będą:

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

To działało świetnie, dziękuję! Ostatnie pytanie: Wartości '426174354' dla' startDate', które są przechowywane w Core Data, w jakim formacie to jest? Nie sądzę, żeby to było w sekundach, prawda? – user1107173

+1

To właściwie jest: jest to liczba sekund, które upłynęły od pierwszej chwili 1 stycznia 2001 roku, GMT. Więcej informacji można znaleźć w [Referencji NSDate] (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/Reference/Reference.html) – spassas

+0

Dzięki! Być może również znasz to: http://stackoverflow.com/questions/24556123/nsfetchedresultscontroller-multiple-frcs-delegate-error-when-updating – user1107173