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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- EntityとDAO
- Room Databaseクラス
- クエリとリレーションシップ
- Flowでデータを監視する