カテゴリ: Kotlin 更新日: 2026/01/01

KotlinのRoomでコルーチン対応!suspend関数とFlowの使い方をやさしく解説

KotlinのRoomのコルーチン対応(suspend・Flow)の書き方
KotlinのRoomのコルーチン対応(suspend・Flow)の書き方

先生と生徒の会話形式で理解しよう

生徒

「KotlinのRoomでデータベースを使うとき、非同期処理って必要ですか?」

先生

「うん、Roomではデータベース操作に時間がかかることがあるから、アプリが固まらないようにコルーチンで非同期処理をするのが基本なんです。」

生徒

「コルーチンって何ですか?難しそう…」

先生

「大丈夫!コルーチンは、簡単にいうと“待っている間に他の作業をする”ような仕組みだよ。Roomでは、suspend関数やFlowと一緒に使うから、実際の使い方を順番に見ていこう!」

1. Roomでコルーチンを使う理由とは?

1. Roomでコルーチンを使う理由とは?
1. Roomでコルーチンを使う理由とは?

Roomのデータベース操作は時間がかかることがあります。たとえば、何千件ものデータを読み込むときなど、アプリが一瞬止まったように感じることもあります。

そこでKotlinのコルーチンを使うと、画面表示とは別の流れで処理を行えるので、スムーズな操作を保てます。

2. suspend(サスペンド)とは?

2. suspend(サスペンド)とは?
2. suspend(サスペンド)とは?

suspend(サスペンド)関数とは、「一時停止できる関数」のことです。重い処理を一時中断して、あとで続きを再開できるのが特徴です。

Roomでは、データの追加・更新・削除などに使うのが一般的です。

3. Flow(フロー)とは?

3. Flow(フロー)とは?
3. Flow(フロー)とは?

Flowは、データの流れを非同期で受け取る仕組みです。LiveDataと似ていますが、Kotlinの標準ライブラリとして使え、より柔軟な操作ができます。

Roomでは、「データをリアルタイムで監視したい」ときに使います。

4. KotlinでRoomのDAOにsuspend関数とFlowを使う方法

4. KotlinでRoomのDAOにsuspend関数とFlowを使う方法
4. KotlinでRoomのDAOにsuspend関数とFlowを使う方法

では、KotlinのRoomで、suspendFlowを使う具体例を見てみましょう。

① エンティティ(データの形)を定義


import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "tasks")
data class Task(
    @PrimaryKey(autoGenerate = true) val id: Int = 0,
    val title: String,
    val isDone: Boolean
)

② DAOにsuspendとFlowを使った関数を定義


import androidx.room.*
import kotlinx.coroutines.flow.Flow

@Dao
interface TaskDao {

    @Insert
    suspend fun insertTask(task: Task)

    @Update
    suspend fun updateTask(task: Task)

    @Delete
    suspend fun deleteTask(task: Task)

    @Query("SELECT * FROM tasks ORDER BY id DESC")
    fun getAllTasks(): Flow<List<Task>>
}

ポイント:データを追加・更新・削除するときはsuspend、データを受け取るときはFlowを使います。

5. ViewModelやUIでの使い方

5. ViewModelやUIでの使い方
5. ViewModelやUIでの使い方

Flowを受け取るには、collect関数を使って監視します。例として、ViewModelでデータを取得するコードは以下のようになります。


class TaskViewModel(private val dao: TaskDao) : ViewModel() {

    val taskList: Flow<List<Task>> = dao.getAllTasks()

    fun addTask(title: String) {
        viewModelScope.launch {
            dao.insertTask(Task(title = title, isDone = false))
        }
    }
}

6. suspendとFlowを使うと何がうれしいの?

6. suspendとFlowを使うと何がうれしいの?
6. suspendとFlowを使うと何がうれしいの?
  • アプリが固まりにくい:重い処理を非同期で実行できる
  • コードがシンプルになる:非同期でも読みやすい
  • リアルタイム表示ができる:Flowで自動的に更新

つまり、見た目がサクサク動くアプリを作るのに欠かせない技術なんです。

7. 注意点:Flowはコレクションするまで動かない

7. 注意点:Flowはコレクションするまで動かない
7. 注意点:Flowはコレクションするまで動かない

Flowは定義しただけでは動きません。画面側やViewModel側でcollectしてはじめてデータが流れます。

また、suspend関数はlaunchwithContextの中で呼び出す必要があるため、必ずコルーチンの範囲で使うようにしましょう。

8. KotlinのRoomで非同期処理を行うならコルーチンが基本!

8. KotlinのRoomで非同期処理を行うならコルーチンが基本!
8. KotlinのRoomで非同期処理を行うならコルーチンが基本!

今のKotlin開発では、Roomとコルーチンはセットで使うのが標準です。昔はAsyncTaskという仕組みが使われていましたが、今はsuspendFlowでシンプルに書けるようになりました。

最初はむずかしく感じるかもしれませんが、Roomでコルーチン対応しておけば、アプリが軽くて快適になります。

関連記事:
カテゴリの一覧へ
新着記事
New1
Kotlin
Kotlinの構文ルールまとめ!インデント・セミコロンなど初心者が最初に覚えるべきポイント
New2
Kotlin
Kotlinの関数ドキュメンテーションコメント(KDoc)の書き方を徹底解説!初心者でもわかる丁寧なガイド
New3
Kotlin
KotlinでHello Worldを表示するには?最初の1行を実行してみよう
New4
Go言語
Go言語の依存関係管理を始めよう!go modの基本設定と導入手順
人気記事
No.1
Java&Spring記事人気No1
Kotlin
Gradleファイル(build.gradle.kts)の書き方と役割をやさしく解説!Kotlin初心者向け完全ガイド
No.2
Java&Spring記事人気No2
Go言語
Go言語の関数パラメータ!値渡しと参照渡しの違いを理解しよう
No.3
Java&Spring記事人気No3
Kotlin
KotlinのAPI通信でGETリクエストを送る方法!初心者向け徹底ガイド
No.4
Java&Spring記事人気No4
Swift
SwiftのURLSessionでのネットワークエラー対策!再試行とタイムアウトを初心者向けに解説
No.5
Java&Spring記事人気No5
Go言語
Go言語のテストでタイムアウト・並行処理を扱うポイント
No.6
Java&Spring記事人気No6
Kotlin
Android Studioのインストール手順と初期設定を初心者向けに完全解説!
No.7
Java&Spring記事人気No7
Go言語
Go言語のWebアプリにおけるセキュリティベストプラクティス集
No.8
Java&Spring記事人気No8
Swift
Swift JSONデコード失敗の原因と対処|DecodingError徹底解説