코드랩 Room 사용하기1
Room이라는건 작년 앱잼때 처음 들어보고 9월인가 10월에 한번 사용해봤다. 너무 오랜만에 써보는거라 기억이 가물가물하다.
- Room이란?
- 내부 데이터베이스인 SQLite 테이블에 데이터를 저장할 수 있는 Jetpack 제공, 데이터베이스 아키텍처다.
1. 엔터티 만들기 테이블의 Column을 만들어준다. @Entitiy어노테이션으로 엔티티라는것을 알려주고 옆에 tableName을 써준다.
SleepNight
//데이터베이스 엔티티 ,테이블 이름 설정
@Entity(tableName = "daily_sleep_quality_table")
data class SleepNight(
@PrimaryKey(autoGenerate = true) //고유의 ID, 자동으로 +1 씩 증가되게
var nightId : Long = 0L,
@ColumnInfo(name = "start_time_milli") //속성 이름 지정
val startTimeMilli: Long = System.currentTimeMillis(),
@ColumnInfo(name = "ent_time_milli")
var endTimeMilli: Long = startTimeMilli,
@ColumnInfo(name = "quality_rating")
var sleepQuality : Int = -1
)
-
- PrimaryKey(autoGenerate = true)
- nightId를 주요키(고유 값)로 설정하고, autoGenerate 를 true로 해서 추가될때마다 id가 자동으로 1씩 증가해서 저장된다.
-
- ColumnInfo(name=””)
- 컬럼 이름을 지정해준다.
2.DAO 만들기 데이터베이스에서 사용될 쿼리문을 적는곳, interface에 @DAO 어노테이션을 붙여주면 된다. insert, update, delete 는 기본으로 제공하지만, 나머지는 Query어노테이션을 통해 만들어준다! SleepDatabaseDao
@Dao
interface SleepDatabaseDao{
@Insert
fun insert(night : SleepNight) //삽입
@Update
fun update(night : SleepNight) //수정
@Query("SELECT * FROM daily_sleep_quality_table WHERE nightId= :Key") //id가 key인 객체를 하나 가져옴
fun get(Key:Long):SleepNight? //null처리
@Query("DELETE FROM daily_sleep_quality_table") //전체 삭제
fun clear()
@Query("SELECT * FROM daily_sleep_quality_table ORDER BY nightId DESC LIMIT 1 ")//내림차순으로 정렬후 첫번째 요소 가져옴
fun getTonight(): SleepNight?
@Query("SELECT * FROM daily_sleep_quality_table ORDER BY nightId DESC") //내림차순 후 전부 가져옴
fun getAllNights(): LiveData<List<SleepNight>>
}
3.Database 생성하기 만들어둔 엔터티와 DAO를 사용하는 데이터베이스 홀더 클래스를 만들어준다. abstract class로 만들어줘야하고, @Database 어노테이션을 붙여아한다. 그리고 ()안의 entities 는 해당 디비의 엔터티, version은 스키마를 변경할 시 높여줘야하며 exportSchema 는 스키마 버전 기록 백업 유지 여부다.
SleepDatabase
@Database(entities = [SleepNight::class], version = 1, exportSchema = false)
abstract class SleepDatabase : RoomDatabase(){
abstract val sleepDatabaseDao : SleepDatabaseDao //쿼리 등이 들어있는 인터페이스
companion object{ //java static과 유사, 객체를 만들지 않고서도 데이터베이스 만들거나 가져오는 메소드 접근 가능
@Volatile // 캐시에 저장하지 마 ! -> 메인 메모리에 저장하고 불러옴 -> 데이터베이스 동시변경x ,, 모든 스레드에 즉시 표시o
private var INSTANCE : SleepDatabase? = null
fun getInstance(context: Context):SleepDatabase{
synchronized(this){//여러 스레드가 동시에 데이터베이스 요청하는걸 방지, 한번의 하나 실행 스레드만 ! -> 데이터베이스 한번만 초기화됨
var instance = INSTANCE //로컬 변수의 스마트 캐스트 ? if(instance == null){ //데이터베이스가 만들어진적 없다면
instance = Room.databaseBuilder( //생성
context.applicationContext,
SleepDatabase::class.java,
"sleep_history_base"
)
.fallbackToDestructiveMigration() //이전에 생성한 데이터베이스 삭제 후 새로운 디비 생성
.build()
INSTANCE = instance
}
return instance
}
}
}
}
Room 전체 앱에 대해 하나의 데이터베이스 인스턴스만 필요하므로 싱글톤으로 만들어줘야한다.
Room 데이터베이스 만들기 끝 !
참고
Room: https://developer.android.com/reference/android/arch/persistence/room/RoomDatabase
Comments