Mam model Core Data z NSDate
właściwością. Chcę filtrować bazę danych według dnia. Zakładam, że rozwiązanie będzie obejmować NSPredicate
, ale nie jestem pewien, jak to wszystko połączyć.
Wiem, jak porównać dzień dwóch dni NSDate
przy użyciu NSDateComponents
i NSCalendar
, ale jak mogę to przefiltrować za pomocą NSPredicate
?
Być może muszę utworzyć kategorię w mojej NSManagedObject
podklasie, która może zwracać samą datę z tylko rokiem, miesiącem i dniem. Wtedy mógłbym porównać to w pliku NSPredicate
. Czy to twoja rekomendacja, czy jest coś prostszego?
objective-c
core-data
nsdate
nspredicate
nsfetchedresultscontroller
Jonathan Sterling
źródło
źródło
==
. Chociaż jeśli szukasz według dnia, pamiętaj, że NSDate to data i godzina - możesz użyć zakresu od północy do północy.startDate
na 2012-09-17 0:00:00 iendDate
2012-09-18 0:00:00, a predykat na startDate <= date <endDate. To będzie się działo przez cały czas 17.09.2012.Przykład, jak ustawić również startDate i endDate dla powyższej odpowiedzi:
Tutaj szukałem wszystkich wpisów w ciągu miesiąca. Warto wspomnieć, że ten przykład pokazuje również, jak wyszukiwać wpisy z datą „zero”.
źródło
W Swift dostałem coś podobnego do:
Trudno mi było odkryć, że interpolacja ciągów
"\(this notation)"
nie działa przy porównywaniu dat w NSPredicate.źródło
Rozszerzenie Swift 3.0 dla Date:
Następnie użyj:
źródło
Przeniosłem odpowiedź z Glauco Neves do Swift 2.0 i umieściłem ją w funkcji, która odbiera datę i zwraca
NSPredicate
z odpowiedniego dnia:źródło
Dodając do odpowiedzi Rafaela (niezwykle przydatne, dziękuję!), Portowanie na Swift 3.
źródło
Niedawno spędziłem trochę czasu próbując rozwiązać ten sam problem i dodać następujące informacje do listy alternatyw w celu przygotowania dat rozpoczęcia i zakończenia (zawiera zaktualizowaną metodę dla iOS 8 i nowszych) ...
... i
NSPredicate
dla danych podstawowychNSFetchRequest
(jak już pokazano powyżej w innych odpowiedziach) ...źródło
Dla mnie to działa.
Odfiltrowałem tablicę od aktualnej daty do 7 dni wstecz. Mam na myśli, że otrzymuję dane z tygodnia od bieżącej daty. To powinno działać.
Uwaga: konwertuję datę, która nadchodzi z mili sekundami na 1000 i porównuję później. Daj mi znać, jeśli potrzebujesz jasności.
źródło
completeArray
jest to, że ma Array ofdictionary
lubdataModel
chcę zastosować na DataModel.Opierając się na poprzednich odpowiedziach, aktualizacja i alternatywna metoda wykorzystująca Swift 5.x
Jeśli wolisz
endOfDay
ustawić godzinę na 23:59:59, możesz zamiast tego dołączyć ...ale wtedy możesz zmienić NSPredicate na ...
... ze szczególnym uwzględnieniem zmiany z
day < %@
naday <= %@
.źródło