Ukazała się pierwsza wersja alfa biblioteki Room 3.0. Room 3.0 to główna wersja biblioteki, która wprowadza zmiany powodujące niezgodność. Koncentruje się na Kotlin Multiplatform (KMP) i dodaje obsługę JavaScript i WebAssembly (WASM) oprócz dotychczasowej obsługi Androida, iOS i JVM na komputerach.
W tym poście na blogu opisujemy zmiany powodujące niezgodność, powody, dla których powstała biblioteka Room 3.0, oraz różne sposoby migracji z Room 2.0.
Zmiany powodujące niezgodność
Room 3.0 zawiera te zmiany powodujące niezgodność z interfejsem API:
- Wycofanie interfejsów API SupportSQLite: Room 3.0 jest w pełni obsługiwana przez interfejsy API sterownika androidx.sqlite. Interfejsy API SQLiteDriver są zgodne z KMP, a usunięcie zależności Room od interfejsu API Androida upraszcza interfejs API na Androidzie, ponieważ eliminuje konieczność obsługi 2 możliwych backendów.
- Koniec generowania kodu Java: Room 3.0 generuje wyłącznie kod Kotlin. Jest to zgodne z rozwijającym się paradygmatem Kotlin-first, ale też upraszcza bazę kodu i proces tworzenia, co umożliwia szybsze iteracje.
- Skupienie się na KSP: wycofujemy też obsługę przetwarzania adnotacji Java (AP) i KAPT. Room 3.0 jest wyłącznie procesorem KSP (Kotlin Symbol Processing), co pozwala na lepsze przetwarzanie baz kodu Kotlin bez ograniczeń języka Java.
- Współprogramy na pierwszym miejscu: Room 3.0 wykorzystuje współprogramy Kotlin, dzięki czemu jej interfejsy API są oparte na współprogramach. Współprogramy to asynchroniczna platforma zgodna z KMP, a asynchroniczny charakter Room jest kluczowym wymaganiem do obsługi platform internetowych.
Nowy pakiet
Aby zapobiec problemom ze zgodnością z dotychczasowymi implementacjami Room 2.x i bibliotekami z zależnościami przechodnimi od Room (np. WorkManager), Room 3.0 znajduje się w nowym pakiecie, co oznacza, że ma też nowe identyfikatory grupy i artefaktu Maven. Na przykład androidx.room:room-runtime zmienił się na androidx.room3:room3-runtime, a klasy takie jak androidx.room.RoomDatabase będą teraz znajdować się w androidx.room3.RoomDatabase.
Kotlin i współprogramy na pierwszym miejscu
Ponieważ nie generujemy już kodu Java, Room 3.0 wymaga też KSP i kompilatora Kotlin, nawet jeśli baza kodu, która wchodzi w interakcję z Room, jest napisana w Javie. Zalecamy używanie projektu wielomodułowego, w którym użycie Room jest skoncentrowane, a wtyczkę Kotlin Gradle i KSP można zastosować bez wpływu na resztę bazy kodu.
Room 3.0 wymaga też współprogramów, a konkretnie funkcji DAO, które muszą być zawieszane, chyba że zwracają typ reaktywny, np. Flow. Room 3.0 nie zezwala na blokowanie funkcji DAO. Informacje o tym, jak zacząć integrować współprogramy z aplikacją, znajdziesz w dokumentacji współprogramów na Androidzie.
Migracja do interfejsów API SQLiteDriver
W związku z wycofaniem SupportSQLite aplikacje będą musiały przejść na interfejsy API SQLiteDriver. Ta migracja jest niezbędna, aby w pełni wykorzystać zalety Room 3.0, w tym możliwość używania dołączonej biblioteki SQLite za pomocą BundledSQLiteDriver. Migrację do interfejsów API sterownika możesz rozpocząć już dziś, korzystając z Room 2.7.0 lub nowszej. Zdecydowanie zalecamy unikanie dalszego używania SupportSQLite. Jeśli zmigrujesz integracje Room do interfejsów API SQLiteDriver, przejście na Room 3.0 będzie łatwiejsze, ponieważ zmiana pakietu polega głównie na aktualizacji odwołań do symboli (importów) i może wymagać minimalnych zmian w miejscach wywołań.
Krótki przegląd interfejsów API SQLiteDriver znajdziesz w dokumentacji interfejsów API SQLiteDriver.
Więcej informacji o tym, jak zmigrować Room do korzystania z interfejsów API SQLiteDriver, znajdziesz w oficjalnej dokumentacji migracji z SupportSQLite.
Otoka SupportSQLite w Room
Rozumiemy, że całkowite usunięcie SupportSQLite może nie być od razu możliwe w przypadku wszystkich projektów. Aby ułatwić przejście, w Room 2.8.0, najnowszej wersji z serii Room 2.0, wprowadziliśmy nowy artefakt o nazwie androidx.room:room-sqlite-wrapper. Ten artefakt oferuje interfejs API zgodności, który umożliwia przekształcenie RoomDatabase w SupportSQLiteDatabase, nawet jeśli interfejsy API SupportSQLite w bazie danych zostały wyłączone z powodu zainstalowania SQLiteDriver. Jest to tymczasowe rozwiązanie dla deweloperów, którzy potrzebują więcej czasu na pełną migrację bazy kodu. Ten artefakt nadal istnieje w Room 3.0 jako androidx.room3:room3-sqlite-wrapper, aby umożliwić migrację do Room 3.0 przy jednoczesnym zachowaniu obsługi krytycznego użycia SupportSQLite.
Na przykład wywołania roomDatabase.openHelper.writableDatabase można zastąpić przez roomDatabase.getSupportWrapper(), a otoka będzie dostępna nawet wtedy, gdy w konstruktorze Room zostanie wywołana funkcja setDriver().
Więcej informacji znajdziesz w dokumentacji room-sqlite-wrapper.
Obsługa Room i SQLite w internecie
Obsługa platformy Kotlin Multiplatform obejmuje JS i WasmJS i wprowadza niektóre z najważniejszych zmian w interfejsie API. W szczególności wiele interfejsów API w Room 3.0 to funkcje zawieszania, ponieważ prawidłowa obsługa pamięci masowej w internecie jest asynchroniczna. Interfejsy API SQLiteDriver zostały też zaktualizowane, aby obsługiwać internet, a nowy asynchroniczny sterownik internetowy jest dostępny w androidx.sqlite:sqlite-web. Jest to sterownik oparty na Web Worker, który umożliwia utrwalanie bazy danych w prywatnym systemie plików pochodzenia (OPFS).
Więcej informacji o tym, jak skonfigurować Room w internecie, znajdziesz w informacjach o wersji Room 3.0.
Niestandardowe typy zwracane przez DAO
Room 3.0 umożliwia dodawanie niestandardowych integracji do Room podobnych do RxJava i Paging. Dzięki nowemu interfejsowi API adnotacji o nazwie @DaoReturnTypeConverter możesz utworzyć własną integrację, tak aby wygenerowany przez Room kod był dostępny w czasie działania. Umożliwia to funkcjom @Dao posiadanie niestandardowych typów zwracanych bez konieczności czekania, aż zespół Room doda obsługę. Dotychczasowe integracje są migrowane do korzystania z tej funkcji, dlatego osoby, które z niej korzystają, będą musiały dodać konwertery do definicji @Database lub @Dao.
Na przykład konwerter Paging będzie znajdować się w artefakcie androidx.room3:room3-paging i będzie się nazywać PagingSourceDaoReturnTypeConverter. W przypadku LiveData konwerter znajduje się w androidx.room3:room3-livedata i nazywa się LiveDataDaoReturnTypeConverter.
Więcej informacji znajdziesz w sekcji Konwertery typów zwracanych przez DAO w informacjach o wersji Room 3.0.
Tryb konserwacji Room 2.x
Ponieważ prace nad Room będą się koncentrować na Room 3, obecna wersja Room 2.x przechodzi w tryb konserwacji. Oznacza to, że nie będziemy rozwijać żadnych głównych funkcji, ale nadal będziemy publikować wersje poprawek (2.8.1, 2.8.2 itp.) z poprawkami błędów i aktualizacjami zależności. Zespół będzie kontynuować te prace do czasu, aż Room 3 stanie się stabilna.
Uwagi końcowe
Jesteśmy bardzo podekscytowani potencjałem Room 3.0 i możliwościami, jakie otwiera ona dla ekosystemu Kotlin. Będziemy na bieżąco informować o postępach.
-
Nowości dotyczące produktówAndroid Studio Quail 2 jest już stabilne i gotowe do użycia w środowisku produkcyjnym. Wprowadza zmiany w IDE dzięki współbieżnym przepływom pracy agenta, natywnie zintegrowanemu profilowaniu wycieków pamięci i usuwaniu awarii z uwzględnieniem kontekstu.
Amman Asfaw • 3 minuty czytania -
Nowości dotyczące produktówW marcu wprowadziliśmy Android Bench – naszą tabelę wyników LLM dla rzeczywistych zadań programowania na Androidzie. Od tego czasu ulepszyliśmy test porównawczy na podstawie Waszych opinii, w tym oceniliśmy modele o otwartej wadze i dodaliśmy do tabeli wyników wymiary kosztów i wydajności.
Zoe Lopez-Latorre • 3 minuty czytania -
Nowości dotyczące produktówW Google Play dokładamy wszelkich starań, aby zapewnić użytkownikom jak najlepsze wrażenia, a deweloperom – narzędzia i elastyczność, które pozwolą im odnieść sukces.
Paul Feng • 3 minuty czytania
Otrzymuj co tydzień najnowsze informacje o tworzeniu aplikacji na Androida na swoją skrzynkę odbiorczą.