0Pricing
Android Academy · レッスン

Flowでデータを監視する

データベースの変更にリアクティブに対応します

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

リアクティブなデータベース読み取り

一度だけクエリを実行する代わりに、Roomは基になるデータが変更されるたびに新しい値を発行するFlowを返せます。UIは自動的に更新されます。

DAOからFlowを返す

戻り値の型をFlow<...>として宣言します。suspendではないことに注目してください。

@Query("SELECT * FROM users ORDER BY name")
fun observeUsers(): Flow<List<User>>

ここでsuspendを使わない理由

suspend関数は1つの結果を返して終了します。一方、Flowは継続的なストリームなので、ストリームオブジェクトを返す通常の関数として定義し、時間をかけてcollectします。

Roomが再発行を認識する仕組み

Roomはクエリが参照するテーブルを追跡します。対象のテーブルに影響する書き込みが行われると、Roomはクエリを再実行し、新しい結果をFlowに流します。これは自動的に行われます。

コルーチン内でcollectする

通常はViewModel内のコルーチンでflowをcollectします。

viewModelScope.launch {
    dao.observeUsers().collect { users ->
        _uiState.value = UiState(users)
    }
}

Flowを変換する

公開する前に、mapなどの演算子でストリームを変換できます。

val names: Flow<List<String>> =
    dao.observeUsers().map { list ->
        list.map { it.name }
    }

StateFlowに変換する

stateInを使って、DAOのcoldなflowをUI用のhotなStateFlowに変換します。

val uiState = dao.observeUsers()
    .map { UiState(it) }
    .stateIn(
        viewModelScope,
        SharingStarted.WhileSubscribed(5000),
        UiState()
    )

Composeでcollectする

画面では、これまでに学んだとおり、ライフサイクルを考慮した形でその状態をcollectします。

@Composable
fun UsersScreen(vm: UserViewModel) {
    val state by vm.uiState
        .collectAsStateWithLifecycle()
    UserList(state.users)
}

リアクティブな処理の全体像

まとめると:

  • データが変更されるとRoomが値を発行します。
  • ViewModelがstateInを介してUI状態に変換します。
  • ComposeがcollectAsStateWithLifecycleでcollectします。

どこからデータベースに書き込んでも、画面は自動的に更新されます。

Single Source of Truth

このパターンにより、データベースがSingle Source of Truthになります。UIが古いコピーを保持することはなく、常に実際に保存されている内容を反映します。

書き込みが更新をトリガーする

監視対象のテーブルに対するinsert、update、deleteが行われるとflowが再発行されるため、変更後にリストを手動で更新する必要はありません。

suspend fun addUser(u: User) = dao.insert(u)
// observeUsers() flow re-emits automatically

理解度チェック

Flowでデータを監視する方法についての理解度を確認しましょう。

まとめ

学習した内容:

  • Flowを返すDAOメソッドは、データが変更されると再発行します。
  • これらはストリームを返す通常の(non-suspend)関数です。
  • stateInとcollectAsStateWithLifecycleを使って、UIをリアクティブに更新します。
  • データベースがSingle Source of Truthになります。

よくある質問

「Flowでデータを監視する」レッスンは無料ですか?

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

「Flowでデータを監視する」で何を学びますか?

データベースの変更にリアクティブに対応します ブラウザで直接実行するハンズオンコードでAndroid Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「Flowでデータを監視する」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. EntityとDAO
  2. Room Databaseクラス
  3. クエリとリレーションシップ
  4. Flowでデータを監視する
← Android Academyに戻る