Zapisywanie danych w lokalnej bazie danych za pomocą Room
Należy do Android Jetpack.
Aplikacje, które obsługują znaczne ilości uporządkowanych danych, mogą znacznie skorzystać z przechowywania tych danych lokalnie. Najczęstszym przypadkiem użycia jest przechowywanie w pamięci podręcznej odpowiednich części danych, aby w przypadku utraty dostępu do sieci użytkownik mógł nadal przeglądać te treści w trybie offline.
Biblioteka trwałości Room zapewnia warstwę abstrakcji nad SQLite, aby umożliwić płynny dostęp do bazy danych przy jednoczesnym wykorzystaniu pełnej mocy SQLite. W szczególności Room oferuje te korzyści:
- weryfikacja zapytań SQL w czasie kompilacji;
- wygodne adnotacje, które minimalizują powtarzający się i podatny na błędy szablonowy kod;
- Uproszczone ścieżki migracji bazy danych.
Z tego powodu zdecydowanie zalecamy korzystanie z Room zamiast bezpośredniego korzystania z interfejsów SQLite API.
Konfiguracja
Aby używać Room w aplikacji, dodaj do pliku build.gradle
aplikacji te zależności.
dependencies { val room_version = "2.6.1" implementation("androidx.room:room-runtime:$room_version") // If this project uses any Kotlin source, use Kotlin Symbol Processing (KSP) // See Add the KSP plugin to your project ksp("androidx.room:room-compiler:$room_version") // If this project only uses Java source, use the Java annotationProcessor // No additional plugins are necessary annotationProcessor("androidx.room:room-compiler:$room_version") // optional - Kotlin Extensions and Coroutines support for Room implementation("androidx.room:room-ktx:$room_version") // optional - RxJava2 support for Room implementation("androidx.room:room-rxjava2:$room_version") // optional - RxJava3 support for Room implementation("androidx.room:room-rxjava3:$room_version") // optional - Guava support for Room, including Optional and ListenableFuture implementation("androidx.room:room-guava:$room_version") // optional - Test helpers testImplementation("androidx.room:room-testing:$room_version") // optional - Paging 3 Integration implementation("androidx.room:room-paging:$room_version") }
dependencies { def room_version = "2.6.1" implementation "androidx.room:room-runtime:$room_version" // If this project uses any Kotlin source, use Kotlin Symbol Processing (KSP) // See KSP Quickstart to add KSP to your build ksp "androidx.room:room-compiler:$room_version" // If this project only uses Java source, use the Java annotationProcessor // No additional plugins are necessary annotationProcessor "androidx.room:room-compiler:$room_version" // optional - RxJava2 support for Room implementation "androidx.room:room-rxjava2:$room_version" // optional - RxJava3 support for Room implementation "androidx.room:room-rxjava3:$room_version" // optional - Guava support for Room, including Optional and ListenableFuture implementation "androidx.room:room-guava:$room_version" // optional - Test helpers testImplementation "androidx.room:room-testing:$room_version" // optional - Paging 3 Integration implementation "androidx.room:room-paging:$room_version" }
Główne komponenty
Pokój składa się z 3 głównych elementów:
- Klasa bazy danych, która przechowuje bazę danych i stanowi główne miejsce dostępu do połączenia z danymi zapisanymi w aplikacji.
- Ewentycje danych reprezentujące tabele w bazie danych aplikacji.
- obiekty dostępu do danych (DAO), które udostępniają metody, których aplikacja może używać do wysyłania zapytań, aktualizowania, wstawiania i usuwania danych w bazie danych;
Klasa bazy danych udostępnia aplikacji instancje DAO powiązane z tą bazą danych. Aplikacja może z kolei używać DAO do pobierania danych z bazy danych jako wystąpienia powiązanych obiektów danych. Aplikacja może też używać zdefiniowanych jednostek danych do aktualizowania wierszy w odpowiednich tabelach lub do tworzenia nowych wierszy do wstawiania. Rysunek 1 przedstawia relacje między różnymi komponentami Room.

Przykładowa implementacja
W tej sekcji przedstawiono przykładową implementację bazy danych Room z jedną ością danych i jedną DAO.
Element danych
Poniższy kod definiuje element danych User
. Każda instancja User
reprezentuje wiersz w tabeli user
w bazie danych aplikacji.
@Entity data class User( @PrimaryKey val uid: Int, @ColumnInfo(name = "first_name") val firstName: String?, @ColumnInfo(name = "last_name") val lastName: String? )
@Entity public class User { @PrimaryKey public int uid; @ColumnInfo(name = "first_name") public String firstName; @ColumnInfo(name = "last_name") public String lastName; }
Więcej informacji o podmiocie danych w Room znajdziesz w artykule Definiowanie danych za pomocą obiektów Room.
Obiekt dostępu do danych (DAO)
Poniższy kod definiuje DAO o nazwie UserDao
. UserDao
udostępnia metody, których reszta aplikacji używa do interakcji z danymi w tabeli user
.
@Dao interface UserDao { @Query("SELECT * FROM user") fun getAll(): List<User> @Query("SELECT * FROM user WHERE uid IN (:userIds)") fun loadAllByIds(userIds: IntArray): List<User> @Query("SELECT * FROM user WHERE first_name LIKE :first AND " + "last_name LIKE :last LIMIT 1") fun findByName(first: String, last: String): User @Insert fun insertAll(vararg users: User) @Delete fun delete(user: User) }
@Dao public interface UserDao { @Query("SELECT * FROM user") List<User> getAll(); @Query("SELECT * FROM user WHERE uid IN (:userIds)") List<User> loadAllByIds(int[] userIds); @Query("SELECT * FROM user WHERE first_name LIKE :first AND " + "last_name LIKE :last LIMIT 1") User findByName(String first, String last); @Insert void insertAll(User... users); @Delete void delete(User user); }
Więcej informacji o DAO znajdziesz w artykule Dostęp do danych za pomocą DAO Room.
Baza danych
Poniższy kod definiuje klasę AppDatabase
, która będzie przechowywać bazę danych.
AppDatabase
definiuje konfigurację bazy danych i stanowi główny punkt dostępu aplikacji do zapisanych danych. Klasa bazy danych musi spełniać te warunki:
- Klasa musi być opatrzona adnotacją
@Database
, która zawiera tablicęentities
z listą wszystkich elementów danych powiązanych z bazą danych. - Klasa musi być abstrakcyjną klasą rozszerzającą klasę
RoomDatabase
. - W przypadku każdej klasy DAO powiązanej z bazą danych klasa bazy danych musi zdefiniować metodę abstrakcyjną, która nie ma argumentów i zwraca instancję klasy DAO.
@Database(entities = [User::class], version = 1) abstract class AppDatabase : RoomDatabase() { abstract fun userDao(): UserDao }
@Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); }
Uwaga: jeśli aplikacja działa w ramach pojedynczego procesu, podczas tworzenia instancji obiektu AppDatabase
należy przestrzegać wzorca projektowego singleton. Każda instancja RoomDatabase
jest dość droga i rzadko potrzebujesz dostępu do wielu instancji w ramach jednego procesu.
Jeśli aplikacja działa w kilku procesach, podczas wywołania kreatora bazy danych dodaj enableMultiInstanceInvalidation()
. Dzięki temu, jeśli masz wystąpienie AppDatabase
w każdym procesie, możesz unieważnić plik współdzielonej bazy danych w jednym procesie, a unieważnienie zostanie automatycznie rozszerzone na wystąpienia AppDatabase
w innych procesach.
Wykorzystanie
Po zdefiniowaniu encji danych, interfejsu DAO i obiektu bazy danych możesz użyć tego kodu do utworzenia instancji bazy danych:
val db = Room.databaseBuilder( applicationContext, AppDatabase::class.java, "database-name" ).build()
AppDatabase db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "database-name").build();
Następnie możesz użyć abstrakcyjnych metod z interfejsu AppDatabase
, aby uzyskać instancję DAO. Następnie możesz używać metod instancji DAO do interakcji z bazą danych:
val userDao = db.userDao() val users: List<User> = userDao.getAll()
UserDao userDao = db.userDao(); List<User> users = userDao.getAll();
Dodatkowe materiały
Więcej informacji o Room znajdziesz w tych materiałach:
Próbki
Mir 2: Return of the King to wysokiej jakości gra mobilna o postaciach z Legendy, która została autoryzowana przez Actoz Soft i oparta na silniku Unity. Ta gra nie tylko doskonale odtwarza wrażenia z Mir 2, koreańskiej gry fantasy typu MMORPG, ale Wuthering Waves to fabularna gra akcji z grafiką wysokiej jakości stworzona przez Kuro Games.
Optymalizacja zużycia energii jest bardzo ważna, aby zapewnić użytkownikom najwyższą jakość wrażeń podczas długich sesji grania. Android Studio wprowadziło Godot Engine to popularny wieloplatformowy silnik gier typu open source, który zapewnia solidne wsparcie dla Androida. Godot może służyć do tworzenia gier praktycznie dowolnego gatunku. Umożliwia tworzenie grafiki 2D i 3D. Wersja 4 Godota wprowadziła Dynamiczny interfejs wydajności Androida (ADPF) to potężne narzędzie Google przeznaczone dla deweloperów, którzy chcą zoptymalizować wydajność swoich aplikacji. Za pomocą interfejsów API dotyczących temperatury aplikacja ADPF udostępnia informacje NCSoft Lineage W to wieloosobowa gra fabularna (MMORPG) opracowana przez NCSoft. Ta gra dziedziczy tradycję oryginalnej gry Lineage W, oferując środowisko, w którym gracze z całego świata mogą współpracować i rywalizować na serwerach globalnych. Poprawa wydajności i zarządzanie temperaturą są niezbędne do tworzenia udanych gier na Androida. Deweloperzy musieli do tej pory rozwiązywać te problemy przez zmniejszenie wierności odwzorowania lub dalszą optymalizację renderera.
Zmiany te są zwykle Call of Duty: Warzone Mobile to gra akcji z perspektywy pierwszej osoby należąca do popularnej serii Call of Duty. Wersja mobilna tej popularnej gry na konsole i komputery korzysta z interfejsów API na niskim poziomie, aby zapewnić graczom świetne Summoners War: Chronicles to mobilna gra MMORPG od południowokoreańskiego dewelopera Com2uS, która została wydana na całym świecie w marcu 2023 roku. Do tej pory gra Summoners War zarobiła ponad 2, 7 miliarda dolarów i została pobrana ponad Summoners War: Chronicles US(WW) i KR autorstwa Com2uS korzysta z Vulkana wyłącznie do renderowania na Androidzie, co zapewnia wzrost wydajności nawet o 30%. Vulkan to nowoczesny, wieloplatformowy interfejs API do obsługi grafiki 3D, który został Ares: Rise of Guardians to science fiction MMORPG na urządzenia mobilne i PC stworzona przez koreańskie studio Second Dive, które słynie z doświadczenia w tworzeniu gier z serii RPG akcji. Gra została opublikowana przez Kakao Games. Akcja gry toczy Cat Daddy Games to w 100% należące do 2K studio z Kirkland w stanie Waszyngton, które jest twórcą gry NBA 2K Mobile.
Zespół chciał poprawić ogólną jakość i stabilność gier, w szczególności poprzez zmniejszenie liczby błędów typu „Aplikacja nie Devsisters to globalny twórca i wydawca gier mobilnych, który tworzy gry rekreacyjne oparte na chronionej prawem własności intelektualnej marki Cookie Run. Do najpopularniejszych gier studia należą Cookie Run: OvenBreak (gra zręcznościowa) i Cookie NEW STATE Mobile to gra typu battle royale firmy Krafton, która została wydana w listopadzie 2021 r. na całym świecie. W pierwszym miesiącu od premiery osiągnęła ponad 45 mln pobrania. KRAFTON, Inc. to grupa niezależnych studiów tworzących gry, które Spokko to polska grupa ambitnych twórców, którzy pracują nad bardzo wymagającym projektem. Chociaż jest częścią rodziny CD PROJEKT, Spokko jest niezależną firmą, która przeniosła wspaniały świat The Witcher: Monster Slayer na smartfony. Wiedźmin: Cat Daddy Games to w całości należące do 2K studio z siedzibą w Kirkland w stanie Waszyngton. Zespoły odpowiedzialne za gry NBA 2K Mobile, NBA SuperCard i WWE SuperCard szukały rozwiązania, które pozwoliłoby im poprawić ogólną jakość gier dla Electronic Arts (EA) to firma zajmująca się produkcją gier z siedzibą w Kalifornii w Stanach Zjednoczonych. Firma produkuje wiele gier z różnych gatunków, takich jak sport, akcja, wyścigi i symulacje. Studio deweloperskie Firemonkeys należące do EA Unreal Engine to opracowany przez Epic Games silnik do tworzenia gier, który zapewnia twórcom z różnych branż swobodę i kontrolę nad tworzeniem zaawansowanych treści rozrywkowych, atrakcyjnych wizualizacji i wciągających światów wirtualnych. Niektóre Deweloper z Warszawy, studio CD Projekt RED (CDPR), przekształciło minigrę z gry Wiedźmin 3 w odrębną grę bezpłatne GWINT: Wiedźmińska Gra Karciana, która w marcu 2020 r. została udostępniona w Google Play.
Z powodu dużego początkowego rozmiaru pliku Od ponad 20 lat firma Gameloft tworzy innowacyjne gry na platformy cyfrowe, od gier mobilnych po gry na PC i konsole. Oprócz własnych, dobrze znanych serii firma Gameloft tworzy gry dla popularnych marek, takich jak LEGO, Universal i Hasbro. W 2000 r. powstała firma Gameloft, która z pasją tworzy gry i chce udostępniać je graczom na całym świecie. To jedni z pionierów w rozwijaniu gier mobilnych. Obecnie mają w portfolio ponad 190 gier. Wiele gier mobilnych Gameloft ma skomplikowane Amerykański deweloper RV AppStudios ma do tej pory ponad 200 milionów pobrań w portfolio gier casualowych, edukacyjnych aplikacji dla dzieci i aplikacji użytkowych. Jako jeden z pierwszych testowała ona funkcję Play Asset Delivery w swojej aplikacji Pixonic,
zespołu twórców gier wideo z siedzibą w Moskwie,
wykorzystują każdą okazję do ulepszenia swoich aplikacji mobilnych i dotarcia do jeszcze większej
graczy. Jedną z najbardziej znanych aplikacji firmy jest Roboty wojenne 12-osobowa rozgrywka Gameloft zawsze stara się być jednym z pierwszych deweloperów, którzy publikują gry na najnowszym przenośnym sprzęcie, aby zapewnić graczom niesamowite wrażenia w ruchu. Dlatego firma wiedziała, że ChromeOS to odpowiednie miejsce dla Asphalt 8:Mir 2 poprawia wydajność renderowania dzięki użyciu biblioteki Frame Pacing
Kuro Games zmniejsza zużycie energii o 9,68% dzięki profilowaniu zużycia energii w Android Studio i ODPM w przypadku gry Wuthering Waves
Optymalizacja Godot Engine Vulkan na Androida
Pierwsze kroki z ramami Android Dynamic Performance Framework (ADPF) w Unreal Engine
NCSoft Lineage W zwiększa stabilną wydajność i zapobiega ograniczaniu temperatury za pomocą ADPF
MediaTek zwiększa dynamiczną wydajność układów SOC Androida
Grafika Call of Duty Warzone Mobile zapewnia lepszą grafikę dzięki interfejsowi Vulkan
Com2uS – Gry Google Play na PC
Com2uS korzysta z interfejsu Vulkan, aby zwiększyć jakość grafiki
Kakao Games zwiększa stabilność liczby klatek na sekundę do 96% dzięki funkcji Android Adaptability
2K zmniejsza częstotliwość błędów ANR o 35% dzięki pakietowi Android Game Development Kit
Cookie Run: OvenBreak oszczędza ponad 200 tys. USD kosztów CDN dzięki Play Asset Delivery
NEW STATE Mobile zmniejsza wykorzystanie GPU o 22% dzięki narzędziu Android GPU Inspector
Wiedźmin: Pogromca Potworów zwiększa swój zasięg dzięki narzędziu Android Performance Tuner
Rozdzielczość 2K zapewnia wyższą jakość grafiki dzięki Play Asset Delivery
Firemonkeys skrócił czas tworzenia i debugowania aplikacji dzięki AGDE
„AGDE is freaking awesome!” (tworzenie aplikacji na Androida za pomocą Unreal Engine)
CD Projekt RED zmniejsza rozmiar aktualizacji o 90% i zwiększa ich częstotliwość o 10% dzięki rozwiązaniu Play Asset Delivery
Gameloft zmniejsza zużycie energii urządzenia o 70%, co przekłada się na wydłużenie czasu gry o 35% dzięki interfejsowi Game Mode API
Gameloft zdobywa o 10% więcej nowych użytkowników dzięki Google Play Asset Delivery
RV AppStudios poprawia utrzymanie użytkowników dzięki Google Play Asset Delivery
Firma Pixonic zwiększyła zaangażowanie użytkowników ChromeOS o 25% dzięki optymalizacji pod kątem dużych ekranów
Gameloft zwiększa przychody 9-krotnie dzięki optymalizacji pod kątem ChromeOS