SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

一歩進んだAndroidアプリ開発ができる「Android Jetpack」入門

Hiltの応用的なインジェクションとモジュール利用

一歩進んだAndroidアプリ開発ができる「Android Jetpack」入門 第18回

Roomを利用する場合(1)

 前回の図1のパターンで残っているのは、Roomの利用です。

Hilt+RoomでのAppDatabase

 Roomを利用する場合、少しテクニックが必要です。というのは第2回で紹介したように、Roomの場合は、DAOをインターフェースで作成します。

 また、AppDatabaseを抽象クラスで作成し、しかもシングルトンパターンでインスタンス生成を行う必要があります。この仕組みとHiltを組み合わせる場合、そもそもインスタンス生成がRoomに任せるため、Roomによって生成されたインスタンスをHiltによって注入させるコードパターンを取る必要があります。と同時に、シングルトンの仕組みもHiltに任せます。

 そこでまず、AppDatabase内に、第2回のリスト7リスト8のように、シングルトンパターンを組み込んだコードではなく、単にDAOインスタンスを生成するメソッドを定義したコードとします。

 これは、Javaならばリスト5、Kotlinならばリスト6のコードです。

[リスト5]AppDatabase.java
@Database(entities = {Cocktailmemo.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
  public abstract CocktailmemoDAO createCocktailmemoDAO();
}
[リスト6]AppDatabase.kt
@Database(entities = [Cocktailmemo::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
  abstract fun createCocktailmemoDAO(): CocktailmemoDAO
}

モジュールの作成

 代わりに、HiltによってAppDatabaseやDAOインスタンスを生成するモジュールを作成します。これは、Javaならばリスト7、Kotlinならばリスト8のコードとなります。

[リスト7]AppDatabaseModule.java
@Module  // (1)
@InstallIn(SingletonComponent.class)  // (2)
public class AppDatabaseModule {  // (3)
  @Provides  // (4)
  @Singleton  // (5)
  public AppDatabase provideDatabase(@ApplicationContext Context context) {  // (6)
    return Room.databaseBuilder(context, AppDatabase.class, "cocktailmemo_db").build();  // (7)
  }
  @Provides  // (8)
  public CocktailmemoDAO provideCocktailmemoDAO(AppDatabase db) {  // (9)
    return db.createCocktailmemoDAO();  // (10)
  }
}
[リスト8]AppDatabaseModule.kt
@Module  // (1)
@InstallIn(SingletonComponent::class)  // (2)
object AppDatabaseModule {  // (3)
  @Provides  // (4)
  @Singleton  // (5)
  fun provideDatabase(@ApplicationContext context: Context): AppDatabase {  // (6)
    return Room.databaseBuilder(context, AppDatabase::class.java, "cocktailmemo_db").build()  // (7)
  }
  @Provides  // (8)
  fun provideCocktailmemoDAO(db: AppDatabase): CocktailmemoDAO {  // (9)
    return db.createCocktailmemoDAO()  // (10)
  }
}

 リスト7、およびリスト8のポイントは、次の通りです。

クラス/オブジェクトを作成する

 (3)の通り、Javaの場合はクラスで、Kotlinの場合はオブジェクトとして生成します。その名称はなんでもかまいません。

 ただし、(1)のように@Moduleアノテーションを付与します。また、@InstallInアノテーションを付与し、このモジュールが属するスコープを指定します。その引数としてSingletonComponentクラスを指定することで、このモジュールがシングルトンスコープに属すことになり、結果、後述する@Singletonが利用できるようになります。

インスタンス生成メソッドに@Providesアノテーションを付与する。

 (4)と(8)が該当します。

AppDatabaseを生成するメソッドを定義する。

 (6)が該当します。その際、引数としてContextを定義し、それを(7)のAppDatabaseの生成コードで利用します。ただし、このContext引数に@ApplicationContextアノテーションを付与しておかないとApplicationContextが渡されないので注意してください。

 また、このメソッドによって生成されるAppDatabaseインスタンスこそ、シングルトンの必要があるので(5)のように@Singletonアノテーションを付与します。

DAOインスタンス生成メソッドを定義する。

 (9)が該当します。その際、AppDatabaseを引数とします。そして、メソッド内部では(10)のようにAppDatabaseの引数を利用して、DAOインスタンスの生成コードを記述します。

次のページ
Roomを利用する場合(2)

この記事は参考になりましたか?

一歩進んだAndroidアプリ開発ができる「Android Jetpack」入門連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 齊藤 新三(サイトウ シンゾウ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook <個人紹介>WINGSプロジェクト所属のテクニカルライター。Web系製作会社のシステム部門、SI会社を経てフリーランスとして独立。屋号はSarva(サルヴァ)。HAL大阪の非常勤講師を兼務。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/23390 2026/02/27 08:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング