Room - Migracje

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 Room?

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:

  • Database - odpowiada połączeniu do bazy danych i stanowi główny punkt odniesienia
  • Entity (encja) - Odwzorowanie tabeli w bazie danych
  • DAO (obiekt dostępu do danych) - Określa sposoby operacji na encjach

Więcej o Room'ie możesz znaleźć tutaj:

Room Persistence Library

Po co dokonywanie migracji?

W 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.

Jak przeprowadzić migrację 🤔

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.

Klasyczna migracja

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.

Destrukcyjna migracja 🔥

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.

BONUS: Walka z migracją

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 😊

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.