Wyszukanie recordów z aktualną datą

0

Cześć wszystkim.

Od pewnego czasu uczę się programować i pisze aplikacje. Nie mogę poradzić sobie z jedną rzeczą w moim programie. Chciałbym, żeby program wyszukiwał wszystkie wpisy w bazie danych z aktualną datą i wyświetlał je we fragmencie. Stworzyłem w tym celu bazę danych z odpowiednim zapytaniem

@Query("SELECT * FROM exercises_table WHERE date = :dateSearch")
fun getExercisesByDate(dateSearch: Long): Flow<List<Exercise>>

metodę która ustawia aktualną datę i zapisuje ją jako zmienną w vm:

private fun setupCurrentDate() {
    val date = Calendar.getInstance()
    viewModel.date = date.timeInMillis
}

a to kod który umieściłem w onViewCreated:

setupCurrentDate()
val date = viewModel.date

binding.todayRecyclerView.layoutManager = LinearLayoutManager(requireContext())
mainVm.getExercisesByDate(date).observe(viewLifecycleOwner){exercises ->
    binding.todayRecyclerView.adapter = TodayAdapter(exercises,
        {exercise, position -> })
}

Czy ktoś może wie dlaczego nie wyszukuje żadnych wpisów z dzisiejszą datą mimo, że takie są ?
Z góry dziękuję za pomoc i pozdrawiam :)

2

Ogólnie najlepiej debugerem zobaczyć.

Zrób imitację bazy https://sqliteonline.com/ i sobie sprawdź czy ci wyszukuje zapytanie sql, a potem resztę dokończ w programie.

Lub ręcznie otwórz bazę z konsoli i zobacz czy odczytasz.

0

zmieniłem w kodzie na takie zapytanie:

 @Query("SELECT * FROM exercises_table WHERE category = :categorySearch")
    fun getExercisesByCategory(categorySearch: String): Flow<List<Exercise>>

i teraz po uruchomieniu tego kodu:

val date = "aa"

        binding.todayRecyclerView.layoutManager = LinearLayoutManager(requireContext())
        mainVm.getExercisesByCategory(date).observe(viewLifecycleOwner){exercises ->
            binding.todayRecyclerView.adapter = TodayAdapter(exercises,
                {exercise, position -> })
        }

wyszukuje mi prawidłowe wpisy. Wydaje mi się, że z formatem daty jest coś nie tak, ale nie wiem. Dopiero się uczę i ciężko mi to ogarnąć :(

0

Data ma różny poziom dokładności, jak masz zapisane razem z sekundami to nie znajdziesz nic z "aktualną datą". Musisz uciąć do poziomu jednego dnia.

2

Również uważam, że datę masz ze zbyt dużą dokładnością i wyszukuje tylko obiekty z tej sekundy lub nawet milisekundy ;)

0
SirConceptz napisał(a):

Również uważam, że datę masz ze zbyt dużą dokładnością i wyszukuje tylko obiekty z tej sekundy lub nawet milisekundy ;)

Jak mogę zmienić dokładność daty?
I czy mam ją zmienić w bazie danych czy w wyszukiwaniu?

0
NorbertStr napisał(a):
SirConceptz napisał(a):

Również uważam, że datę masz ze zbyt dużą dokładnością i wyszukuje tylko obiekty z tej sekundy lub nawet milisekundy ;)

Jak mogę zmienić dokładność daty?
I czy mam ją zmienić w bazie danych czy w wyszukiwaniu?

No problemos ;-)

val timeInMillis = Twój czas w milisekundach
val date = Date(timeInMillis)
val format = SimpleDateFormat("yyyy-MM-dd")
return format.format(date)

W takiej sytuacji będziesz miał kod w bazie w formacie rok-miesiac-dzien. Mając coś takiego możesz łatwo sortować po dacie, sprawdzić obiekty z danego dnia, itp. Jakbyś chciał to później gdzieś wyświetlić to możesz zastosować np. taki kod:

    fun dateToVisibleWithYear(dateToConvert: String): String {
        val dateArray = dateToConvert.split("-")
        var convertedDate = ""
        if (dateArray.size == 3) {
            val calendar = Calendar.getInstance()
            calendar.set(dateArray[0].toInt(), dateArray[1].toInt(), dateArray[2].toInt())
            val date = Date(calendar.timeInMillis)
            val format = SimpleDateFormat("dd MMM yyyy")
            convertedDate = format.format(date)
        }
        return convertedDate
    }

W razie potrzeby sortowania to możesz zrobić jak na poniższym przykładzie:

    @Query("SELECT * FROM products ORDER BY expirationDate ASC")
0

Można deż podejść do tego inaczej. Jeśli chcesz dane z całego dnia np z 24 lutego 2022 roku to szukasz z zakresu (2022.02.24T00.00.00, 2022.02.25T00.00.00> co się przekłada na SQLa

SELECT * 
  FROM exercises_table 
 WHERE :dateSearchStart <= date
   AND date < :dateSearchEnd
0
KamilAdam napisał(a):

Można deż podejść do tego inaczej. Jeśli chcesz dane z całego dnia np z 24 lutego 2022 roku to szukasz z zakresu (2022.02.24T00.00.00, 2022.02.25T00.00.00> co się przekłada na SQLa

To niebezpieczne jest. A co jeśli akurat nadzieje się na datę w której dla danego użytkownika zmieniano kalendarz?

0
loza_prowizoryczna napisał(a):
KamilAdam napisał(a):

Można deż podejść do tego inaczej. Jeśli chcesz dane z całego dnia np z 24 lutego 2022 roku to szukasz z zakresu (2022.02.24T00.00.00, 2022.02.25T00.00.00> co się przekłada na SQLa

To niebezpieczne jest. A co jeśli akurat nadzieje się na datę w której dla danego użytkownika zmieniano kalendarz?

Jakbym miał dostęp do konkretnego SQLa to zrobiłbym bazodanywy plusDays(1). Ale nie wiem co za baza. Z drugiej strony mamy tu datę trzymaną jakio ilość miliseund więc dużo gorzej byc nie może :P

1

Racja

KamilAdam napisał(a):

Jakbym miał dostęp do konkretnego SQLa to zrobiłbym bazodanywy plusDays(1). Ale nie wiem co za baza. Z drugiej strony mamy tu datę trzymaną jakio ilość miliseund więc dużo gorzej byc nie może :P

No to dla bazy danych przynajmniej mamy problem rozwiązany bo data początkowa jest arbitralnie ustawiona dla każdego kalendarza (zakładając unix time). Ale jeśli np. użytkownik chciałby wyszukać tydzień dla Rosji w okolicach końcówki stycznia 1918 roku to mógłby się trochę zdziwić :P

0

Z drugiej strony mamy tu datę trzymaną jakio ilość miliseund więc dużo gorzej byc nie może :P

W takim razie w jakim formacie najlepiej jest trzymać datę w bazie danych?

0
NorbertStr napisał(a):

W takim razie w jakim formacie najlepiej jest trzymać datę w bazie danych?

Najlepiej w takim który trzyma jak najwięcej danych referencyjnych co do kontekstu. Teoretycznie jeden punkt referencyjny powinien wystarczyć ale jak to mówią w tym świecie wszystko płynie.

0
NorbertStr napisał(a):

Z drugiej strony mamy tu datę trzymaną jakio ilość miliseund więc dużo gorzej byc nie może :P

W takim razie w jakim formacie najlepiej jest trzymać datę w bazie danych?

To by trzeba wiedzieć co to za baza

1 użytkowników online, w tym zalogowanych: 0, gości: 1