8

Używam NSFetchedResultsController i UITableViewController aby wypełnić UITableView z bazy danych CoreData.NSPredicate i CoreData - zdecydować, czy atrybut Data jest „dziś” (lub od ostatniej nocy 12am dziś wieczorem 12am) na iOS

Mam obiekt NSDate zapisany w tym atrybucie Data oznaczonym "startTime". Następnie próbuję jedynie wyciągnąć dane transmisji męska użyciu NSPredicate, który wygląda tak:

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

Dostaję zerowe wyniki. Rozumiem to, ponieważ obiekt NSDate po prostu trzyma liczbę sekund lub milisekund, czy coś innego od 1 stycznia 1970 r., Prawda? Porównywanie 1111111111111 i 1111111111112, w tym samym dniu, są dwoma odrębnymi obiektami, które nie są równe.

Jak zatem można sformatować NSPredicate, aby mógł to zrobić? Mam zamiar zgadnąć, że tworzy on dwa obiekty: jeden, który jest o północy wczoraj wieczorem, a drugi o tej porze o 12 rano i porównuje początek i koniec, czy jest pomiędzy tymi dwoma s. NSDate.

Jestem nowy dla NSPredicate, więc jak można to osiągnąć?

+0

Należy umieścić swoje rozwiązanie w odpowiedzi, zamiast umieszczać ją w pytaniu. – yuji

+0

Nie można @yuji, ponieważ nie mam jeszcze wystarczającej rep. –

+0

Może w odpowiedzi możesz podać ** swoje ** rozwiązanie. W międzyczasie zredagowałem to widząc, ponieważ już zaakceptowałeś odpowiedź Yuji. Możesz odzyskać swoje rozwiązanie, przeglądając historię wersji. Dzięki. – Kev

Odpowiedz

24

Użyj NSCompoundPredicate.

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

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

Gdzie firstDate jest 12am to rano i wieczorem jest secondDate 12am.

P.S. Oto jak uzyskać 12am to rano:

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 

Aby uzyskać dzisiaj 12am, zmień components.day.

+1

Dziękuję bardzo - kilka małych literówek - andPredicateWithSubpredicates (małe litery P) i użyj NSDateComponents zamiast NSCalendarComponents – amergin

Powiązane problemy