1. 단축키 없이 마우스 오른쪽 클릭 후 컨텍스트 메뉴에서 Source>Generate Getters and Setters 를 선택
마우스 오른쪽 클릭 후 나오는 컨텍스트 메뉴의 Source 옆에 나와 있듯이 아래 컨텍스트 메뉴를 띄울 때는Alt + Shift + S사용합니다.
그리고 아래 컨텍스트 메뉴에서 Generate Getters and Setters 를 실행하기 위해R을 눌러줍니다.
Alt + Shift + S ->R
그리고나면 아래와 같이 Generate Getters and Setters 다이얼로그가 나옵니다.
현재 Test 라는 필드에 대한 getter setter 를 만들려고 합니다.
다이얼로그 오른쪽 버튼에는 접근 가능한 단축키가 적혀져 있네요. Alt + A(모든 필드에 대한 getter setter 선택) Alt + D(모든 필드에 대한 getter setter 선택 해제) Alt + G(모든 필드에 대한 getter 선택 해제) Alt + l(모든 필드에 대한 setter 선택 해제)
별도로 지정하고 싶다면 마우스를 사용해서 하나씩 체크 해 주셔야 합니다.
여기서 엔터를 치면 OK 버튼으로 Selection 이 가있지 않기 때문에 다이얼로그 창이 OK 되어 닫히지 않습니다.
OK 로 Selection 이 가게 하기 위해서Alt + S를 눌러줍니다. 그리고 엔터를 치면 모든 과정이 단축키를 통해 getter setter 를 추가 할 수 있게 됩니다.
추가로 Alt + Shift + S 로 유용하게 사용 할 수 있는 기능이implemet나override를 할 메소드를 찾아서 추가하는 기능입니다. Alt + Shift + S를 누르고 나서V를 누르면 위의 기능을 사용 할 수 있습니다.
결론적으로 모든 필드에 대한 getter setter 추가를 단축키로 끝내는 순서는 아래와 같습니다.
Caused by: android.view.InflateException: Binary XML file line #12: Binary XML file line #26: Error inflating class android.support.design.widget.FloatingActionButton Caused by: android.view.InflateException: Binary XML file line #26: Error inflating class android.support.design.widget.FloatingActionButton Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.design.widget.FloatingActionButton" on path: DexPathList[[zip file ~~
Caused by: android.view.InflateException: Binary XML file line #11: Binary XML file line #11: Error inflating class androidx.core.view.ViewPager Caused by: android.view.InflateException: Binary XML file line #11: Error inflating class androidx.core.view.ViewPager
import java.util.Random
fun main(args: Array<String>) {
val random = Random()
val num = random.nextInt(4)
val stars = arrayOf("★☆☆☆☆", "★★☆☆☆", "★★★☆☆", "★★★★☆", "★★★★★")
val rand_stars = stars.get(num)
print("나의 Today's LUCK:" + rand_stars)
}
dependencies {
def room_version = "2.2.0-beta01"
implementation "androidx.room:room-runtime:$room_version"
// For Kotlin use kapt instead of annotationProcessor
annotationProcessor "androidx.room:room-compiler:$room_version"
// optional - Kotlin Extensions and Coroutines support for Room
implementation "androidx.room:room-ktx:$room_version"
// optional - RxJava support for Room
implementation "androidx.room:room-rxjava2:$room_version"
// optional - Guava support for Room, including Optional and ListenableFuture
implementation "androidx.room:room-guava:$room_version"
// Test helpers
testImplementation "androidx.room:room-testing:$room_version"
}
참고:Kotlin 기반 앱의 경우annotationProcessor대신kapt를 사용해야 합니다. 또한kotlin-kapt플러그인을 추가해야 합니다.
3. 개념
- Entity: DB에 저장할 데이터의 형식을 정의. 즉, DB의 테이블.
- DAO(Data Access Object): 데이터접근 객체, 즉 데이터베이스를 통해 수행할 작업(CRUD)을 함수로 정의한 클래스. DAO는 interface나 abstract class가 되야 함. 만약 abstract class로 만들면, 선택적으로 RoomDatabase객체를 생성자의 매개변수로 가질수 있으며 Room은 각 DAO의 구현을 컴파일 시간에 생성함.
- Room Database: DB를 생성하거나 버전을 관리하는 Room DB 객체. 해당 객체를 생성하는 비용이 많이 들기 때문에, 프로젝트에서 singleton으로 구현해야함.
4. 주의사항
- Room의 데이터는 모두 Background-Thread에서 처리해야함. 즉, Main-Thread에서의 DB접근을 허용하지 않음. 허용하고 싶다면 데이터베이스를 생성하는 빌더에서 allowMainThreadQueries()를 호출해야함.
- 허용하지 않는 이유는 데이터를 받아오는 작업이 길어질 경우 UI가 장시간 멈춰버릴수 있기 때문. 그래서 보통 비동기 쿼리를 하게 되는데 반환값으로는 LiveData 또는 RxJava의 Flowable으로 사용하는 경우가 많음.
@Query: 컴파일 시간에 알맞은 쿼리인지를 입증하게 되고, 문제가 있을 시에는 컴파일 에러가 발생함.
Room은 또한 쿼리에 대한 반환값을 확인함.. 반환되는 객체의 필드의 이름이 만약에 대응되는 컬럼이름이 질의응답에서 일치하지 않는다면 Room은 다음과 같이 두가지 방법중 하나로 알림을 줌. (1) 몇몇의 필드명만 일치하는 경우에는 경고 발생 (2) 일치하지 않는 필드명이 있을시 에러 발생