프로그래밍 놀이터/안드로이드, Java

[android] Create views into a database - Room 에 대해 알아보자

돼지왕 왕돼지 2021. 5. 2. 12:41
반응형

 

-

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

 

 

반응형