KotlinのRoomでコルーチン対応!suspend関数とFlowの使い方をやさしく解説
生徒
「KotlinのRoomでデータベースを使うとき、非同期処理って必要ですか?」
先生
「うん、Roomではデータベース操作に時間がかかることがあるから、アプリが固まらないようにコルーチンで非同期処理をするのが基本なんです。」
生徒
「コルーチンって何ですか?難しそう…」
先生
「大丈夫!コルーチンは、簡単にいうと“待っている間に他の作業をする”ような仕組みだよ。Roomでは、suspend関数やFlowと一緒に使うから、実際の使い方を順番に見ていこう!」
1. Roomでコルーチンを使う理由とは?
Roomのデータベース操作は時間がかかることがあります。たとえば、何千件ものデータを読み込むときなど、アプリが一瞬止まったように感じることもあります。
そこでKotlinのコルーチンを使うと、画面表示とは別の流れで処理を行えるので、スムーズな操作を保てます。
2. suspend(サスペンド)とは?
suspend(サスペンド)関数とは、「一時停止できる関数」のことです。重い処理を一時中断して、あとで続きを再開できるのが特徴です。
Roomでは、データの追加・更新・削除などに使うのが一般的です。
3. Flow(フロー)とは?
Flowは、データの流れを非同期で受け取る仕組みです。LiveDataと似ていますが、Kotlinの標準ライブラリとして使え、より柔軟な操作ができます。
Roomでは、「データをリアルタイムで監視したい」ときに使います。
4. KotlinでRoomのDAOにsuspend関数とFlowを使う方法
では、KotlinのRoomで、suspendとFlowを使う具体例を見てみましょう。
① エンティティ(データの形)を定義
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での使い方
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を使うと何がうれしいの?
- アプリが固まりにくい:重い処理を非同期で実行できる
- コードがシンプルになる:非同期でも読みやすい
- リアルタイム表示ができる:Flowで自動的に更新
つまり、見た目がサクサク動くアプリを作るのに欠かせない技術なんです。
7. 注意点:Flowはコレクションするまで動かない
Flowは定義しただけでは動きません。画面側やViewModel側でcollectしてはじめてデータが流れます。
また、suspend関数はlaunchやwithContextの中で呼び出す必要があるため、必ずコルーチンの範囲で使うようにしましょう。
8. KotlinのRoomで非同期処理を行うならコルーチンが基本!
今のKotlin開発では、Roomとコルーチンはセットで使うのが標準です。昔はAsyncTaskという仕組みが使われていましたが、今はsuspendとFlowでシンプルに書けるようになりました。
最初はむずかしく感じるかもしれませんが、Roomでコルーチン対応しておけば、アプリが軽くて快適になります。