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
426174354 = 04 lipiec 2014
muszę utworzyć (3) NSFetchRequest
pomocą predykatów.
Dla startDate
:
fetchRequest1
stosując predykat (ów) trzeba pobrać wszystko, co mieści się w dniu dzisiejszym na podstawie czasu urządzenie użytkownika.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.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?
Żaden z Twoich typów żądań pobierania nie zwraca poprawnych wyników? – spassas
Nie. Czy muszę przekonwertować zapisaną datę tylko na datę? – user1107173