Room を使用してローカル データベースにデータを保存する Android Jetpack の一部。
比較的大量の構造化データを処理するアプリは、そのデータをローカルに永続化することで大きなメリットを得ることができます。最も一般的なユースケースは、デバイスがネットワークにアクセスできない場合でも、ユーザーがオフラインの間にコンテンツをブラウジングできるように、関連するデータをキャッシュに保存することです。
Room 永続ライブラリは SQLite 全体に抽象化レイヤを提供することで、データベースへのスムーズなアクセスを可能にし、SQLite を最大限に活用できるようにします。特に、Room には次のようなメリットがあります。
- SQL クエリのコンパイル時検証。
- 繰り返しが多く間違いを犯しやすいボイラープレート コードを最小限に抑える便利なアノテーション。
- 効率的なデータベース移行パス。
こうしたことから、SQLite API を直接使用するのではなく、Room を使用することを強くおすすめします。
設定
アプリで Room を使用するには、アプリの build.gradle
ファイルに次の依存関係を追加します。
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" }
主要コンポーネント
Room は、次の 3 つの主要コンポーネントで構成されます。
- データベース クラス。データベースを保持し、アプリの永続データに対する基礎的な接続のメイン アクセス ポイントとして機能します。
- データ エンティティ。アプリのデータベースのテーブルを表します。
- データアクセス オブジェクト(DAO)。アプリがデータベースのデータのクエリ、更新、挿入、削除に使用できるメソッドを提供します。
データベース クラスは、そのデータベースに関連付けられている DAO のインスタンスをアプリに提供します。アプリはこの DAO を使用して、関連するデータ エンティティ オブジェクトのインスタンスとしてデータベースからデータを取得できます。また、定義されたデータ エンティティを使用して、対応するテーブルの行を更新したり、挿入用の新しい行を作成したりできます。図 1 に、Room のさまざまなコンポーネントの関係を示します。

実装例
このセクションでは、1 つのデータ エンティティと 1 つの DAO で Room データベースを実装する例を示します。
データ エンティティ
次のコードは、User
データ エンティティを定義しています。User
の各インスタンスは、アプリのデータベースにある user
テーブルの行を表します。
@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; }
Room のデータ エンティティの詳細については、Room エンティティを使用してデータを定義するをご覧ください。
データ アクセス オブジェクト(DAO)
次のコードは、UserDao
という DAO を定義しています。UserDao
は、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); }
DAO の詳細については、Room DAO を使用してデータにアクセスするをご覧ください。
データベース
次のコードは、データベースを保持するために AppDatabase
クラスを定義しています。AppDatabase
はデータベース構成を定義し、永続データに対するアプリのメイン アクセス ポイントとして機能します。データベース クラスは次の条件を満たす必要があります。
- クラスには、データベースに関連付けられたすべてのデータ エンティティをリストする
entities
配列を含む@Database
アノテーションを付ける必要があります。 - クラスは、
RoomDatabase
を拡張する抽象クラスである必要があります。 - データベースに関連付けられた DAO クラスごとに、引数ゼロで 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(); }
注: 単一のプロセスで動作するアプリの場合は、AppDatabase
オブジェクトをインスタンス化する際にシングルトン デザイン パターンに従う必要があります。各 RoomDatabase
インスタンスは非常に高コストであり、単一のプロセス内で複数のインスタンスにアクセスする必要はほとんどありません。
複数のプロセスで動作するアプリの場合は、データベース ビルダーの呼び出しに enableMultiInstanceInvalidation()
を組み込みます。各プロセスに AppDatabase
のインスタンスがある場合、あるプロセスで共有データベース ファイルを無効化すると、他のプロセス内の AppDatabase
のインスタンスにも自動的に反映されます。
使用方法
データ エンティティ、DAO、データベース オブジェクトを定義したら、次のコードを使用してデータベースのインスタンスを作成できます。
val db = Room.databaseBuilder( applicationContext, AppDatabase::class.java, "database-name" ).build()
AppDatabase db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "database-name").build();
その後、AppDatabase
の抽象メソッドを使用して、DAO のインスタンスを取得できます。次に、DAO インスタンスのメソッドを使用して、データベースを操作できます。
val userDao = db.userDao() val users: List<User> = userDao.getAll()
UserDao userDao = db.userDao(); List<User> users = userDao.getAll();
参考情報
Room の詳細については、以下の参考情報をご覧ください。
サンプル
Mir 2: Return of the King は、Actoz Soft がライセンスを付与し、 HK ZHILI YAOAN LIMITED が Unity ゲームエンジンを使用して開発した、高品質の Legend IP モバイルゲームです。 このゲームは、韓国のファンタジー MMORPG を代表する Mir 2 の雰囲気を完璧に再現するだけでなく、装備の収集、大規模な砂攻撃、その他のコア ゲームプレイなど、最も人気のあるゲーム コンテンツも数多く提供しています。 Wuthering Waves は、Kuro Games が開発した高品質のアクション RPG ゲームです。長時間のゲーム セッションでプレミアムなユーザー エクスペリエンスを持続的に提供するには、消費電力を最適化することが非常に重要です。 Android Studio では、Hedgehog(2023.1.1)から Power Profiler が導入されました。これは、デベロッパーが On Device Power Rails Godot Engine は、Android を堅牢にサポートする人気の高いマルチプラットフォームのオープンソース ゲームエンジンです。Godot は、ほぼすべてのジャンルのゲームの作成に使用でき、2D グラフィックと 3D グラフィックの両方に対応しています。Godot バージョン 4 では、高忠実度グラフィック向けの高度な機能を備えた新しいレンダリング システムが導入されました。Godot 4 レンダラは、Vulkan などの最新のグラフィック API 向けに設計されています。 Godot Android Dynamic Performance Framework(ADPF)は、アプリケーションのパフォーマンスを最適化したいデベロッパー向けの Google の強力なツールです。ADPF は、サーマル API を介してデバイスの熱状態に関するリアルタイム情報を提供します。この情報は、アプリのグラフィック設定の調整に使用されます。 研究目的で、Arm は Unreal Engine と ADPF を使用してデモを開発し、ADPF NCSoft Lineage W は、NCSoft が開発した大規模多人数同時参加型オンライン ロールプレイング ゲーム(MMORPG)です。このゲームは、元の Lineage W ゲームの遺産を受け継いでおり、世界中のプレーヤーがグローバル サーバーを通じて協力して競い合うことができる環境を提供します。独自の中世ファンタジーの世界を舞台とする Lineage W は、さまざまなクラス、スキル、戦闘システムを通じて、プレイヤーに深いゲーム体験を提供します。 NCSoft は Android パフォーマンスと温度管理の改善は、Android で成功するゲームを開発するために不可欠です。従来、デベロッパーはゲームの忠実度を下げるかレンダラをさらに最適化することで、こうした問題に対処する必要がありました。こうした変更はゲームに固有の傾向があり、多くの場合、柔軟性に欠けます。 Android エコシステムには、アダプティブ パフォーマンス API がデベロッパーに提供されています。アダプティブ パフォーマンス機能の統合を簡素化し、エコシステムの断片化を減らすために、Google と Call of Duty: Warzone Mobile は、人気の コール オブ デューティ シリーズのファースト パーソン アクション ゲームです。非常に人気のあるコンソール ゲームと PC ゲームをモバイルで実現する場合は、モバイルの低レベル API を活用して、優れたプレーヤー エクスペリエンスを提供します。 技術的な観点から見ると、モバイル実装の目標は、幅広い Android モバイル デバイスをサポートすると同時に、コンソール バージョンに可能な限り近い形で実装を維持し、グラフィック サマナーズウォー: クロニクル は、韓国のゲーム デベロッパー Com2uS が 2023 年 3 月に全世界でリリースしたモバイル MMORPG です。これまでに『サマナーズウォー: Sky Arena』は全世界で 1 億 8, 000 万回以上ダウンロードされ、収益は 27 億ドルを超えています。ファンタジーの世界を舞台にさまざまなモンスターを集めてトレーニングし、他のプレーヤーと戦うサマナーズウォーは、世界で最も人気のあるモバイルゲームの一つです。 約 10 Com2uS の Summoners War: Chronicles US(WW) と KR では、Android でのレンダリングに Vulkan のみを使用し、パフォーマンスが最大 30% 向上しています。 Vulkan は、デバイスのグラフィック ハードウェアとゲームの間の抽象化を最小限に抑えるために設計された最新のクロス プラットフォーム 3D グラフィック API です。Vulkan は OpenGL ES と比較して CPU オーバーヘッドが少なく、Vulkan Ares: Rise of Guardians は、アクション RPG シリーズの開発実績で知られる韓国のゲームスタジオ Second Dive が開発したモバイルから PC への SF MMORPG です。このゲームは Kakao Games によって公開されています。 Cat Daddy Games は、ワシントン州カークランドに拠点を置く 2K 完全所有のスタジオで、NBA 2K Mobile のデベロッパーです。チームは、特に「アプリケーション応答なし」エラー(ANR)を減らすことで、ゲームの全体的な品質と安定性を改善する必要がありました。ANR は、Android アプリの UI スレッドが長時間ブロックされると発生します。そのような場合、UI Devsisters はグローバルなモバイルゲーム デベロッパー兼パブリッシャーで、Cookie Run IP に基づいてカジュアル ゲームを制作しています。特に人気の高いゲームには Cookie Run: OvenBreak (ランニング アーケード)や Cookie Run: Kingdom (ソーシャル RPG)などがあり、韓国、台湾、米国のユーザーをはじめ、世界中のユーザーに愛されています。Cookie Run: OvenBreak はカジュアル ゲームですが、5 NEW STATE Mobile は Krafton のバトルロイヤル ゲームで、2021 年 11 月に全世界でリリースされ、リリース 1 か月で 4, 500 万回以上ダウンロードされました。KRAFTON, Inc. は、独立系ゲーム開発スタジオの集合体で、世界中のゲーマーに革新的で魅力的なエンターテイメント体験を生み出しています。PUBG Studios、Bluehole Studio、Striking Distance ポーランドを拠点とする Spokko は、要求の厳しい IP を扱っている意欲的なクリエイターのグループです。Spokko は CD PROJEKT ファミリーの一員ですが、独立企業として『 The Witcher: Monster Slayer ] の素晴らしい世界をスマートフォンに移しました。 ウィッチャー: モンスター スレイヤーは、拡張現実技術を使ったロケーション ベースの RPG ゲームです。このゲームは計算負荷の高いゲームであり、多くのデバイスに挑戦する必要があります。Spokko Cat Daddy Games は、ワシントン州カークランドに拠点を置く 2K 完全所有のスタジオです。NBA 2K Mobile、NBA SuperCard、WWE SuperCard シリーズのチームは、特にユーザーをサポートするデバイスに高品質のアセットを提供することで、ユーザーに提供するゲームの全体的な品質を向上させるソリューションを探していました。 同社は Play Asset Delivery を実装し、各ユーザーのデバイス設定に合わせて最適化された APK Electronic Arts (EA)は、米国カリフォルニア州に本社を置くゲーム会社です。スポーツ、アクション、レース、シミュレーションなど、さまざまなジャンルのゲームが幅広く製造されています。EA の開発スタジオである Firemonkeys は、 Real Racing 3 、 The Sims FreePlay 、 Need For Speed: No Limits のデベロッパーとしてよく知られています。Firemonkeys は、カスタム Unreal Engine は、Epic Games が開発したゲームエンジンです。あらゆる業界のクリエイターが、最先端のエンターテイメント、魅力的な可視化、没入感のある仮想世界を自由かつ制御できるようにします。一部の主要な Android ゲームは Unreal Engine を使用して構築されています。 図 1. Google Pixel 4 で実行されている Unreal Engine Suntemple のサンプルのスクリーンショット Epic などのゲーム ポーランドのワルシャワを拠点とするゲーム デベロッパー、CD Projekt RED(CDPR)は、ウィッチャー 3 内のミニゲーム「 グウェント ウィッチャーカードゲーム 」を一新し、2020 年 3 月に Google Play でスタンドアロンの無料ゲームとしてリリースしました。ファイルサイズの初期値が大きく、定期的なアップデートで追加のデバイス 2000 年、 Gameloft は、ゲームへの情熱と、世界中のプレーヤーにゲームを届けたいという思いから誕生しました。同社はモバイル向けゲーム開発の先駆的企業であり、現在では 190 本以上のゲームを提供しています。Gameloft のモバイルゲームの多くは、グラフィックが多用されているためにダウンロード サイズが大きくなっていました。そのため、同社にとって、App Bundle インフラストラクチャを基盤とするゲームサービス向けの配信機能のセットである Google Play Asset 米国を拠点とするデベロッパー RV AppStudios は、カジュアル ゲーム、子供向け教育アプリ、ユーティリティ アプリのポートフォリオ全体で、これまでに 2 億回以上のダウンロード数を誇っています。開発チームは、同社のアプリ Puzzle Kids - Animals Shape and Jigsaw Puzzles を Google Play Asset Delivery Gameloft は 20 年以上にわたり、モバイルゲームから PC やゲーム機のクロス プラットフォームのゲームに至るまで、デジタル プラットフォーム向けに革新的なゲーム エクスペリエンスを創出してきました。Gameloft は、独自の確立されたシリーズに加え、LEGO、Universal、Hasbro などの人気ブランドのゲームを開発しています。世界 3,600 人のチームを擁する同社のゲームは、毎月 100 か国以上で 5, 500 万人のユニーク プレーヤーに利用されています。 2018 モスクワを拠点とするゲーム開発会社の Pixonic は、モバイルアプリをアップグレードしてさらに多くのゲーマーにリーチできるよう日々努めています。同社の最も有名なタイトルのひとつである War Robots は、12 人のプレーヤー対プレーヤー(PvP)で、カスタマイズしたロボットを操作して戦闘を行えるゲームです。 2014 年のリリース当初、War Robots は初期の Android Gameloft は、常に最新のポータブル ハードウェアに対応したいち早くゲームを提供し、外出先でもゲームにワクワクするようなエクスペリエンスを提供できるよう努めています。同社は、モバイル レーシング シリーズの最新作品、 アスファルト 8: Airborne を、ChromeOS で開発するのが一番だと考えました。 Gameloft は複数のデバイス向けのゲーム開発に慣れていましたが、アスファルトの操作性を Chromebook に移植するのは難しいと思われました。ChromebookMir 2 で Frame Pacing ライブラリを使用してレンダリング パフォーマンスを改善
Kuro Games が Android Studio Power Profiler と ODPM を使用して Wuthering Waves の消費電力を 9.68% 削減
Android 向け Godot Engine Vulkan の最適化
Unreal Engine での Android Dynamic Performance Framework(ADPF)のスタートガイド
NCSoft の Lineage W が ADPF を使用して持続的なパフォーマンスを向上させ、サーマル スロットリングを回避
MediaTek が Android SoC の動的パフォーマンスを強化
Call of Duty Warzone Mobile で Vulkan を使用してグラフィックを改善
Com2uS - PC 版 Google Play Games
Com2uS が Vulkan を使用してグラフィックを改善
Kakao Games: Android への適応性により FPS の安定性が 96% 向上
2K は Android Game Development Kit を使用して ANR 発生率を 35% 削減
クッキーラン: オーブンブレイク - Play Asset Delivery で CDN コストを 20 万ドル以上削減
NEW STATE Mobile、Android GPU Inspector を使用して GPU 使用率を 22% 削減
The Witcher: Monster Slayer - Android Performance Tuner でリーチを拡大
2K が Play Asset Delivery で高品質のグラフィックを実現
Firemonkeys は AGDE を使用して開発とデバッグの時間を短縮
「AGDE はすごい!」Unreal Engine による Android 開発に最適
CD Projekt RED: Play Asset Delivery でアップデート サイズを 90% 削減し、アップデート率が 10% 向上
Gameloft、Google の Play Asset Delivery により新規ユーザーが 10% 増加
RV AppStudios、Google の Play Asset Delivery でユーザー維持率を改善
Gameloft の事例: Game Mode API を使用してデバイスの消費電力を 70% 削減し、プレイ時間を 35% 延長
Pixonic: 大画面向けに最適化することで ChromeOS でエンゲージメントを 25% 増加
Gameloft の事例: ChromeOS 向けに最適化することで収益を 9 倍に拡大