Android の Room において、Dao のメソッドで Boolean を返したい場合のメモです。
手順としては以下のようになります。
- Dao のメソッドで戻り値を Boolean に設定する
-
@Query
内に SELECT 文を記述する。この際に戻り値で false として返したい場合は0、true として返したい場合は0以外の数値を返すような SELECT 文を記述する
上記の 2 で記述する SELECT 文ではクエリの内容にもよりますが EXISTS
をよく使うかと思います。
ケース1
例えば以下の例では books
という本の情報を保存するテーブルから bookId
に一致するレコードがあるかどうかを検証し、あれば戻り値で true が返され、そうでなければ false が返されます。
@Dao
interface BookDao {
// bookId で指定された本が保存されているかどうかチェック
@Query("SELECT EXISTS(SELECT 1 FROM books WHERE id = :bookId LIMIT 1)")
fun hasBook(bookId: Int): Boolean
}
ケース2
Room では Dao のメソッドの戻り値を Kotlin Coroutines の Flow
や RxJava の Flowable
などにすることも可能です。
この場合、対象のテーブルのレコードに変更があると Flow
や Flowable
を通じて、変更後の値が通知されるようになります。
以下の例では、戻り値を Flow<Boolean>
に設定してテーブル内のレコードの変化に応じて値が通知されるようにしています。
@Dao
interface BookDao {
// 全ての本が読めるかどうかチェック
@Query("SELECT NOT EXISTS(SELECT 1 FROM books WHERE readable = 0)")
fun areAllBooksReadable(): Flow<Boolean>
}
これによって、例えば全ての本が読める場合は画面上でボタンを表示し、そうでない場合はボタンを非表示にしたい、といったケースが以下のように簡単に記述できたりします。
val button: Button = ...
lifecycleScope.launch {
bookDao.areAllBooksReadable()
.collectLatest { readable ->
// 全ての本が読める場合はボタンを表示、そうでない場合は非表示にする
button.isVisible = readable
}
}