0Pricing
Android Academy · レッスン

Repositoryパターン

RepositoryパターンでデータアクセスとUIを分離します。RoomデータベースとネットワークAPIの間を調整し、単一の信頼できる情報源として扱います。

「Repositoryパターン」はCoddyKit上の無料Android Academyレッスンです。 これはレッスン4/6です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAndroid Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Android Academyコースには全6レッスンが含まれています。

なぜRepositoryを使うのか

アプリが大きくなると、ViewModelにデータアクセス用のコード(Roomのクエリ、Retrofitの呼び出し、SharedPreferencesの読み取り)が集中して複雑になることがあります。

Repositoryパターンでは、すべてのデータアクセスを1つのクラスの背後にまとめます。ViewModelはRepositoryとのみやり取りし、データの取得元を意識する必要がありません。

アーキテクチャのレイヤー

推奨されるAndroidアーキテクチャは、次の3つのレイヤーで構成されます。

  • UI Layer — Activity/Fragmentがデータを表示し、ユーザーイベントを送信します
  • ViewModel — 状態を保持し、イベントを処理してRepositoryを呼び出します
  • Repository — Room(ローカル)またはRetrofit(リモート)からデータを取得し、使用するデータソースを決定します

シンプルなRepository

DAOとリモートAPIをラップするRepositoryクラスを作成します。

class NoteRepository(private val dao: NoteDao) {

    // Expose a Flow that emits whenever data changes
    val allNotes = dao.getAllNotes()

    suspend fun insert(note: Note) {
        dao.insert(note)
    }

    suspend fun delete(note: Note) {
        dao.delete(note)
    }

    suspend fun update(note: Note) {
        dao.update(note)
    }
}

ViewModelからRepositoryを使用する

ViewModelはDAOから直接ではなく、Repositoryからデータを取得します。

class NoteViewModel(private val repo: NoteRepository) : ViewModel() {

    val notes = repo.allNotes  // Flow from Repository

    fun addNote(title: String, body: String) {
        viewModelScope.launch {
            repo.insert(Note(title = title, body = body))
        }
    }

    fun deleteNote(note: Note) {
        viewModelScope.launch {
            repo.delete(note)
        }
    }
}

キャッシュ優先戦略

Repositoryでよく使われるパターンに、キャッシュ優先があります。ローカルにキャッシュされたデータをすぐに表示し、その後バックグラウンドでネットワークから更新します。

  • 1. Roomからキャッシュ済みデータをすぐに発行します
  • 2. APIから最新データを取得します
  • 3. Roomに保存します — Flowが自動的に更新されます

これにより、読み込みが速く、最終的には最新のデータを表示できます。

キャッシュ優先の実装

ネットワークからローカルデータベースを更新します。

class ProductRepository(
    private val dao: ProductDao,
    private val api: ProductApiService
) {
    // Room Flow emits local data immediately
    val products = dao.getAllProducts()

    // Call this to sync with the server
    suspend fun refresh() {
        try {
            val remoteProducts = api.getProducts()
            dao.insertAll(remoteProducts)  // overwrites local cache
        } catch (e: Exception) {
            // Network failed — cached data is still shown
        }
    }
}

ViewModelFactory

ViewModelにコンストラクタのパラメータがある場合は、作成にViewModelFactoryが必要です。

class NoteViewModelFactory(
    private val repo: NoteRepository
) : ViewModelProvider.Factory {
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        @Suppress("UNCHECKED_CAST")
        return NoteViewModel(repo) as T
    }
}

// In Activity:
val db = NoteDatabase.getInstance(this)
val repo = NoteRepository(db.noteDao())
val factory = NoteViewModelFactory(repo)
val viewModel = ViewModelProvider(this, factory)[NoteViewModel::class.java]

依存性注入にHiltを使用する

大規模なアプリでRepositoryやViewModelのインスタンスを手動で作成するのは手間がかかります。Hilt(Dependency Injection)を使うと、この処理を自動化できます。

  • クラスに@HiltViewModelや@Injectのアノテーションを付けます
  • Hiltが依存関係を自動的に作成して提供します
  • Factoryに関する定型コードをなくせます

メリットのまとめ

Repositoryパターンには、次のメリットがあります。

  • テスト容易性 — ユニットテストで実際のAPIを偽物に置き換えられます
  • 関心の分離 — ViewModelはデータがローカルかリモートかを意識しません
  • 単一の信頼できる情報源 — 常にRoomを情報源とし、APIはRoomを更新するだけです
  • 柔軟性 — ViewModelを変更せずに、キャッシュやページネーション、新しいデータソースを追加できます

理解度チェック

AndroidアーキテクチャにおけるRepositoryの主な責務は何ですか?

まとめ:Repositoryパターン

推奨されるAndroidアーキテクチャを理解できました。

  • UI → ViewModel → Repository → (Room / Retrofit)
  • Repositoryが単一の信頼できる情報源になります
  • キャッシュ優先:ローカルデータをすぐに表示し、バックグラウンドで更新します
  • ViewModelにコンストラクタのパラメータがある場合はViewModelFactoryを使用します
  • 大規模なアプリではHiltが依存性注入を自動化します

最後のコースでは、ネットワーク通信と仕上げとして、Retrofit、画像、公開について学びます。

よくある質問

「Repositoryパターン」レッスンは無料ですか?

はい。「Repositoryパターン」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Android Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Android Academyコースには全6レッスンが含まれています。

「Repositoryパターン」で何を学びますか?

RepositoryパターンでデータアクセスとUIを分離します。RoomデータベースとネットワークAPIの間を調整し、単一の信頼できる情報源として扱います。 ブラウザで直接実行するハンズオンコードでAndroid Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Android Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAndroid Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/6です。

「Repositoryパターン」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAndroid Academyレッスンでコードを書いて実行できますか?

はい。すべてのAndroid Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ViewModelとLiveData
  2. Room Database
  3. コルーチンとSuspend関数
  4. Repositoryパターン
  5. Navigation Component
  6. Hiltによる依存性注入
← Android Academyに戻る