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フィードバックを取得できます。ローカル設定は不要です。