Android
2020-12-05
Kliknij tutaj i otrzymaj kurs "Room w Android" w promocyjnej cenie 30 zł do 31 grudnia 2020!
Room jest to warstwa abstrakcji do bazy danych SQLite umożliwiająca łatwe i szybkie operowanie na danych.
Jest to oficjalna metoda z korzystania z bazy danych na systemie Android 🤖.
Wyróżniamy w nim trzy główne komponenty:
Więcej o Room'ie możesz znaleźć tutaj:
Room Persistence LibraryW momencie kiedy następuje zmiana w logice biznesowej. To jest jakiś model danych ma od teraz więcej lub mniej pól, musimy tę zmianę także nanieść w tabeli bazy danych.
W przypadku, gdy jesteśmy w trakcie budowania aplikacji ⚒ i żaden użytkownik nie pobrał jeszcze programu i nie utworzył lokalnie swojej bazy na urządzeniu, to nie ma problemu.
Migracja dotyka jednak sytuacji, gdy chcemy dostarczyć obecnym użytkownikom nową funkcjonalność, bez niszczenia ich obecnych danych.
W Room mamy możliwość migrowania danych za pomocą DatabaseCallback i napisania query SQL lub użycia metody fallbackToDestructiveMigration.
I na tym zdaniu mógłbym na dobrą sprawę zakończyć ten wpis 😛. Przyjrzyjmy się obu metodom trochę bliżej.
Jest to metoda najbezpieczniejsza, ale też wymagająca nierzadko dużo pracy.
Pierwszą rzeczą jaką musimy zrobić to stworzenie klasy dziedziczącej po Migration(int1, int2). Gdzie:
int1 - poprzednia wersja bazy danych
int2 - wersja bazy danych do której migrujemy
W tym przypadku migracja polegała na dodaniu kolumny professionOwnerId w tabeli User, tak jak zostało to zrobione w encji.
Warto zauważyć, że jeśli dodajemy nową kolumnę to musi być ona zgodna z polem w klasie. W Kotlinie pola domyślnie nie są nullowe, co wymaga dodania NOT NULL
Co więcej w bazie w tabeli User możemy mieć już użytkowników, którzy wcześniej nie mieli przypisanej profesji. Dla nich musimy określić wartość domyślną: DEFAULT 1
Jak widać nawet przy tak prostej zmianie problemy zaczynają się mnożyć. Nierzadko bywa, że zapytania SQL rosną do gigantycznych rozmiarów 😳
Drugą i ostatnią czynnością jest dodanie migracji do buildera naszej bazy Room.
Jeżeli jesteśmy w trakcie projektowania i budowania naszej aplikacji, a Room zamiast pomagać, nęka nas nieudanymi migracjami 😡, to możemy skorzystać z magicznej ale też niebezpiecznej metody:
fallbackToDestructiveMigration()
Spowoduje ona, że wszystkie tabele w bazie zostaną usunięte, a w ich miejsce Room zostaną utworzone tabele na nowych zasadach. Tak jak w encjach.
Na sam koniec podkreślę, to jeszcze raz. Development usage only! Nie chcesz słuchać niezadowolonych użytkowników, którzy stracili swoje dane.
Kiedy w naszym zapytaniu nie spełnimy wymagań to Room rzuci nam takim oto błędem:
Na pierwszy rzut oka 👀 w porządku. Mamy fajnie porównane: tabela z obecną migracją oraz oczekiwana.
Kiedy jednak tabele rosną i mają wiele przeróżnych kolumn to szukanie tego jednego błędu przypomina szukanie igły w stogu siana.
Na ratunek prezentuję stronę gdzie można szybko i łatwo pozwolić za nas wyszukać błąd 🙌
Room SQLite Difference Finder
Dajcie gwiazdkę temu bohaterowi!
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 😊
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ć.
Zachęcam Cię do odwiedzenia mojej strony na Google Play store i sprawdzenia wszystkich moich aplikacji.