4
1

More than 3 years have passed since last update.

[Android]RoomのDaoのメソッドでBooleanを返す

Last updated at Posted at 2021-07-16

Android の Room において、Dao のメソッドで Boolean を返したい場合のメモです。

手順としては以下のようになります。

  1. Dao のメソッドで戻り値を Boolean に設定する
  2. @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 などにすることも可能です。

この場合、対象のテーブルのレコードに変更があると FlowFlowable を通じて、変更後の値が通知されるようになります。

以下の例では、戻り値を 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
        }
}
4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1