Hyeyeon blog

[Android] Kotlin - Room Database 본문

개발/Android

[Android] Kotlin - Room Database

Hyeyeon.P 2019. 3. 19. 13:26
반응형

1. Dependecy 설정

implementation "android.arch.persistence.room:runtime:$room_version"
kapt "android.arch.persistence.room:compiler:$room_version"
testImplementation "android.arch.persistence.room:testing:$room_version"

2. Entity [링크]

  • Room에서 사용할 Entity Class생성
  • tableName : 사용할 테이블 명 지정
  • @PrimaryKey: 해당 필드를 기본키로 설정
  • autoGenerate: autoIncrement 설정
  • @ColumnInfo: 해당 필드의 테이블 컬럼명 지정(미지정 시 해당 필드와 동일한 이름으로 컬럼 생성)
  • indices = [Index(value = ["테이블 컬럼명"], unique = true)]: 해당 컬럼에 unique 설정
@Entity(tableName = "history", indices = [Index(value = ["word"], unique = true)])
class SearchKeyword(@ColumnInfo("word") val keyword: String) {
    @PrimaryKey(autoGenerate = true)
    var id: Long = 0
}

3. Dao [링크]

    • @Query/@Insert/@Delete/@Update: 해당 메소드의 동작 지정
    • onConflict = OnConflictStrategy.REPLACE/ABORT/FAIL/IGNORE/ROLLBACK: 기본키 충돌 시, 처리 방식 설정 [링크]
    • 모든 쿼리는 분리된 스레드에서 실행

 

interface BaseDao {
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertEntity(vararg entity: T)

    @Delete
    fun deleteEntity(vararg entity: T)
}
@Dao
interface SearchKeywordDao : BaseDao {
    @Query("SELECT * FROM history ORDER BY id DESC LIMIT 5")
    fun selectAllHistories(): List

    @Query("SELECT * FROM history WHERE id = :id ")
    fun selectHistory(id: Long): List
}

4. Database

  • 데이터베이스 생성은 비용이 많이 들어가기 때문에 싱글톤으로 작성
val roomDB = Room.databaseBuilder(context.applicationContext, 데이터베이스_클래스::class.java, "데이터베이스_명.db").fallbackToDestructiveMigration().build()
@Database(entities = [SearchKeyword::class], version = 1)
abstract class SearchKeywordDB : RoomDatabase() {
    abstract fun dao(): SearchKeywordDao

    companion object {
        fun getInstance(context: Context): SearchKeywordDB {
            return Room.databaseBuilder(context.applicationContext, SearchKeywordDB::class.java, "search.db").fallbackToDestructiveMigration().build()
        }
    }
}

5. Usage

val searchKeywordDB = SearchKeywordDB.getInstance(this)
val list = searchKeywordDB.dao().selectAllHistories()

[참고]

[Android Room with a View - Kotlin]

[Room with RxJava]

728x90
Comments