Querying a View
And, just as we can have a @Dao class that works with AppEntity and its table, we can have a @Dao class that works with AppView and its database view:
package com.commonsware.room.misc
import androidx.room.Dao
import androidx.room.DatabaseView
import androidx.room.Query
@DatabaseView(
viewName = "appListView",
value = "SELECT applicationId, displayName, shortDescription, iconUrl FROM apps"
)
data class AppView(
val applicationId: String,
val displayName: String,
val shortDescription: String,
val iconUrl: String
) {
@Dao
interface Store {
@Query("SELECT * FROM appListView")
fun loadListView(): List<AppView>
@Query("SELECT * FROM appListView WHERE applicationId = :applicationId")
fun findById(applicationId: String): AppView?
}
}
loadListView() on AppView.Store will return the exact same list as does listListModels() on AppEntity.Store, as they both refer to the same query. We reference appListView in @Query annotations just like we do tables like apps. The available columns are determined by our value query in the @DatabaseView and our properties on the class that we apply @DatabaseView to. Under the covers, when we query appListView, SQLite will really query apps based on the value query and then sub-select off of that based on the @Query against appListView.
We can also have queries against the view that apply constraints, as seen in findById(). In the end, we treat the database view much like a table… for read operations. We cannot @Insert, @Update, or @Delete data in a database view — for those operations, we have to manipulate the table that is used by the view.
Prev Table of Contents Next
This book is licensed under the Creative Commons Attribution-ShareAlike 4.0 International license.