Room - automatyczny timestamp

Kliknij i wspomóż mnie :)

Android

Kliknij tutaj i otrzymaj kurs "Room w Android" w promocyjnej cenie 30 zł do 31 grudnia 2020!

Co to jest timestamp?

Dla tych, którzy z pojęciem "timestamp" spotykają się pierwszy raz, szybko tłumaczę.

Jest to taka pieczątka obecnej daty i czasu. Do zapamiętania: w wielu językach otrzymasz ją poprzez wywołanie w kodzie czegoś podobnego: Date().now() 🤓.

Jeżeli chodzi o to jak timestamp może wyglądać, to zwykle mamy trzy typy danych:

  • Long - liczba milisekund od daty Unix (1 stycznia 1970 00:00 UTC)
  • Date - obiektowa reprezentacja daty w tym momencie
  • String - data w formie tekstu według umownego formatu np. ISO 8601

Jak można zobaczyć każdy z typów w jakiś sposób określa zapis daty. W momencie konwersji jednak problemy mogą powodować: format, czas lokalny, precyzja.

Jaki typ danych w Room? 🤔

Specyfika bazy danych SQLite na Androidzie pozwoli nam na zapisanie jedynie typów prymitywnych t.j. String i Long.

Przy czym tutaj do rozważenia są dwie kwestie:

1. Typ Long jest bardziej dokładny i uniwersalny
2. Typ String może zostać wygenerowany przez Room automatycznie

Generalnie zalecałbym w aplikacjach produkcyjnych skorzystanie jednak z typu Long jako, że jest on najbardziej podatny na interpretacje na wielu różnych platformach 😇 i nie wymaga określania lokalnego formatu daty w aplikacji.

Niestety automatyczne generowanie timestamp wymaga od nas obsługi typu String. I ja dla przykładu skorzystam właśnie z niego.

Automatyczna data z użyciem CURRENT_TIMESTAMP

Aby w tabeli określić daną kolumnę, ale nie podawać jej wartości w trakcie działania programu, musimy określić adnotację @ColumnInfo z wartością domyślną.

W konstruktorze omijamy dane dla dwóch kolumn: image i timestamp.

Dla image ponieważ nie chcemy mieć tej kolumny w bazie. A dla timestamp ponieważ zostanie automatycznie dodane przez Room 😎.

CURRENT_TIMESTAMP to po prostu jedna z SQLite'owych stałych, które Room rozumie i pozwala używać jako wartości.

Konwersja String do Date

W aplikacji najwygodniej byłoby zadeklarować jednak pole timestamp jako obiekt daty czyli Date.

W tym przypadku możemy zawsze przy wyciąganiu tekstu daty konwertować ją na obiekt daty. Albo pozwolić, żeby Room robił to za nas 😏.

W tym celu trzeba napisać konwerter typu. Aby działanie było wygodne najlepiej zrobić do w obu kierunkach. Date -> String i String -> Date.

Następnie do pola w klasie dodajemy adnotację @TypeConverters, gdzie jako value wskazujemy nasz konwerter.

I gotowe! 🙌 Kod można użyć ponownie w wielu tabelach i nie wymaga to od nas żadnego dodatkowego wysiłku.

Dziękuję Ci za przeczytanie tego materiału 😀 Jeżeli spodobało Ci się to o czym piszę, możesz sprawdzić więcej materiałów na blogu lub udostępnić znajomym. Będzie mi bardzo miło 😊

O mnie

Jestem młodym programistą, który dumnie dzierży wiele pasji takich jak bieganie czy piwowarstwo domowe. Jedną z nich jest także programowanie i o tym właśnie zamierzam tutaj pisać.

Zobacz więcej

Najnowsze posty

Kliknij i wspomóż mnie :)

Zostańmy w kontakcie

* Wymagane
Kliknij i wspomóż mnie :)
shop
Otwórz Sklep Play

Zachęcam Cię do odwiedzenia mojej strony na Google Play store i sprawdzenia wszystkich moich aplikacji.