[android] Create views into a database - Room 에 대해 알아보자
-
2.1.0 이상 버전에서는 Room 에서 SQLite database 의 views 를 지원한다.
Room 은 이런 query-backed class 들을 view 라고 부르며, 이것들은 DAO 에서 일반적인 data object 처럼 취급할 수 있다.
-
entity 와 같이 SELCT 를 view 에 대해서 수행할 수 있다.
그러나 INSERT, UPDATE, DELETE 를 view 에 대해서 수행할 수는 없다.
Create a view
-
View 를 만들기 위해서는 @DatabaseView annotation 을 사용하면 된다.
이 annotation 에 query 값을 지정하면 된다.
@DatabaseView("""
SELECT user.id, user.name, user.departmentId, department.name AS departmentName
FROM user INNER JOIN department
ON user.departmentId = department.id
""")
data class UserDetail(
val id:Long,
val name:String?,
val departmentId:Long,
val departmentName:String?
)
-
돼왕주 : join 에 대해 간략히 알아보자. (https://aroundck.tistory.com/4660)
CROSS JOIN, INNER JOIN, OUTER JOIN 이 있다.
CROSS JOIN
table1 & table2 의 모든 row 를 join 한다.
각 테이블에 x, y 개의 column 이 있었다면 결과 table 은 x+y 개의 column 이 된다.
각 테이블에 a, b 개의 row 가 있었다면 결과 table 은 a * b 개의 row 가 된다.
INNER JOIN
조건에 의한 join 을 수행한다. 가장 많이 사용하는 형태의 JOIN 이며, INNER 는 optional 이다.
ON 을 사용해서 condition 을 지정하며, 추가로 WHERE 절을 줄 수 있다.
OUTER JOIN
INNER JOIN 의 확장판(조건에 의한 JOIN이라는 점에서) 으로 LEFT, RIGHT, FULL OUTER JOIN 이 있으나, SQLite 는 LEFT OUTER JOIN 만 지원한다.
OUTER JOIN 은 기본이 되는 table 이 모두 결과로 나오고, join 이 된 필드들은 채워져서, join 이 안 된 필드들은 null 로 채워져서 나온다.
Associate a view with your database
-
view 를 db 의 일부로 사용하려면, @Database annotation 의 views property 에 이 녀석을 명시해주면 된다.
@Database(entities = arrayOf(User::class),
views = arrayOf(UserDetail::class), version = 1)
abstract class AppDatabase : RoomDatabase(){
abstract fun userDao(): UserDao
}
-
참고자료
https://developer.android.com/training/data-storage/room/creating-views