【Kotlin/Room】@RewriteQueriesToDropUnusedColumnsアノテーションで必要なカラムのみ取得する
この記事からわかること
- Android Studio/KotlinでRoomデータベースの使い方
- @RewriteQueriesToDropUnusedColumnsアノテーションの役割
- 必要なカラムのデータのみを取得するには?
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
公式リファレンス:RewriteQueriesToDropUnusedColumns
環境
- Android Studio:Flamingo
- Kotlin:1.8.20
Roomで特定のカラムだけのデータを取得する方法
RoomでUser
クラスを定義している場合にすべてのデータではなくnameプロパティ(カラム)だけのリストをデータベースから取得したい場合がありました。
@Entity(tableName = "user_table")
data class User(
@PrimaryKey(autoGenerate = true) val id: Int,
val name: String,
val age: Int,
val hobby: String
)
以下のようなクエリだとuser_tableテーブルに格納されているすべてのカラムの情報を取得し、User
型にマッピングされます。
@Query("SELECT * FROM user_table")
fun getAll(): Flowable<List<User>>
ですが欲しいのはnameプロパティのみを持ったリストだけを取得したいのです。これを叶えるのが@RewriteQueriesToDropUnusedColumns
アノテーションです。
@RewriteQueriesToDropUnusedColumns
@RewriteQueriesToDropUnusedColumns
はDaoのクエリに付与することで特定のカラムのみを取得することができるようになるアノテーションです。使用するためには特定のカラムのみを持ったデータクラスを定義する必要があります。
data class UserName(val name: String)
データクラスを定義したら、返り値のデータ型に特定のカラムのみのデータ型を指定し、@RewriteQueriesToDropUnusedColumns
を付与するだけです。
@RewriteQueriesToDropUnusedColumns
@Query("SELECT * FROM user_table")
fun getAll(): Flowable<List<UserName>>
@RewriteQueriesToDropUnusedColumns
を付与しておくとコンパイル時に自動で特定のカラムのみを取得する以下のようなSQLクエリを構築してくれます。
SELECT name FROM (SELECT * FROM user_table)
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。