カテゴリ: 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
Go言語
Go言語のオブジェクト指向の特徴を完全ガイド!初心者でも理解できる他言語との違い
New2
Go言語
Go言語の条件分岐の見やすい書き方を徹底解説!初心者でもわかるif文の使い方
New3
Kotlin
Kotlinのクラス設計に役立つベストプラクティスまとめ|初心者でもわかるクラス設計の考え方
New4
Kotlin
Kotlinでアーキテクチャ設計の基本!MVC・MVP・MVVMの違いを解説
人気記事
No.1
Java&Spring記事人気No1
Go言語
Go言語の関数パラメータ!値渡しと参照渡しの違いを理解しよう
No.2
Java&Spring記事人気No2
Swift
Swift Playgroundの使い方を完全解説!初心者に最適な学習環境の始め方
No.3
Java&Spring記事人気No3
Swift
Swift開発環境の構築方法を徹底解説!Xcode・Windows・Linux対応
No.4
Java&Spring記事人気No4
Kotlin
Gradleファイル(build.gradle.kts)の書き方と役割をやさしく解説!Kotlin初心者向け完全ガイド
No.5
Java&Spring記事人気No5
Kotlin
Kotlinのインストール方法まとめ!Windows・Mac・Linux別にステップ解説
No.6
Java&Spring記事人気No6
Go言語
Go言語のWebアプリにおけるセキュリティベストプラクティス集
No.7
Java&Spring記事人気No7
Kotlin
Kotlinの演算子一覧と使い方!算術・比較・論理演算子の基本を解説
No.8
Java&Spring記事人気No8
Swift
Swiftのオプショナル型とは?初心者でもわかる使い方とアンラップの基礎