코드랩 Room 사용하기1

1 minute read

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 데이터베이스 만들기 끝 !


참고

코드랩: https://developer.android.com/codelabs/kotlin-android-training-room-database?index=..%2F..android-kotlin-fundamentals#0

Room: https://developer.android.com/reference/android/arch/persistence/room/RoomDatabase

Comments