저번에 SQLite 포스팅을 해놓고 Room database는 빼먹었더라구요. ㅎㅎ;
그래서 늦게나마 포스팅 해 보겠습니다.
아래 코드 예제는 인강을 들으면서 작성한 코드입니다.
[전체 코드 보기]
https://github.com/gr2nsky/fastCampus/tree/main/basic/calculator
room이란?
스마트폰에 내장된 DB에 데이터를 저장하기 위해 사용하는 ORM 라이브러리 입니다.
room은 내부적으로 sqlite를 사용하지만, 이를 자바나 코틀린으로 매핑해 접근성과 편의성을 높여줍니다.
어노테이션을 활용해 직관성도 매우 높습니다.
그리고 liveData나 RxJAVA와 같이 Observation 형태도 지원하므로 아키텍쳐 패턴에도 적용이 매우 쉽습니다.
구현하기
1. app level gradle에 종속성 추가
dependencies {
//...
val roomVersion = "2.4.1"
implementation("androidx.room:room-runtime:$roomVersion")
annotationProcessor("androidx.room:room-compiler:$roomVersion")
//...
}
2. Model 구현
@Entity
data class History(
@PrimaryKey val uid: Int?,
@ColumnInfo(name = "expression") val expression: String?,
@ColumnInfo(name = "resultInfo") val result: String?
)
어노테이션을 사용해 추가적인 정보를 입력할 수 있습니다.
primary key의 타입이 int면 null을 입력해도 auto increments 처럼 입력됩니다.
3. DAO 구현
@Dao
interface HistoryDao {
@Query("SELECT * FROM history")
fun getAll(): List<History>
@Insert
fun insertHistory(history: History)
@Query("DELETE FROM history")
fun deleteAll()
// @Delete
// fun delete(history: History)
//
// @Query("SELECT * FROM history WHERE resultInfo LIKE :result LIMIT 1")
// fun findByResult(result: String): History
}
위에서 만든 entity를 활용해 구현할 수 있습니다.
어노테이션으로 다양한 쿼리를 사용할 수 있습니다.
기본적으로 지원되는 insert, delete와 같은 쿼리 외에도 @Query 어노테이션을 사용해 직접 쿼리를 입력할 수 있습니다.
매개변수로 받은 변수는 ':변수명' 으로 쿼리에 입력해 사용할 수 있습니다.
4. Room Database 구축
@Database(entities = [History::class], version = 1)
abstract class AppDatabase: RoomDatabase(){
abstract fun historyDao(): HistoryDao
}
@Database 어노테이션을 활용한 추상화 클래스를 만들어 db객체로 활용할 수 있습니다.
entities 항목은 리스트 타입으로, 여러 엔터티를 등록해서 사용할 수 있습니다.
version은 dao나 엔터티가 변경됬을때 수정해줌으로써, 이후 마이그레이션시에 도움을 줍니다.
사용하기
1. 초기화
var db = Room.databaseBuilder(
applicationContext,
AppDatabase::class.java,
"historyDB"
).build()
위에 만든 room database객체를 초기화합니다.
2. 사용
원칙적으로 메인 스레드에서는 사용할 수 없으므로, 스레드를 생성해서 사용해야 합니다.
//db insert
Thread(Runnable {
db.historyDao().insertHistory(History(null, expressionText, resultText))
}).start()
//디비에서 모든 기록 가져와 할당
Thread(Runnable {
db.historyDao().getAll().reversed().forEach{
runOnUiThread {
val historyView = LayoutInflater.from(this).inflate(R.layout.history_row, null, false)
historyView.findViewById<TextView>(R.id.expressionTextView).text = it.expression
historyView.findViewById<TextView>(R.id.resultTextView).text = "= ${it.result}"
historyLinearLayout.addView(historyView)
}
}
}).start()
//db에서 모든 기록 삭제
Thread(Runnable {
db.historyDao().deleteAll()
}).start()
초기화 한 db객체를 참조해 dao를 활용할 수 있습니다.
마치며
이번 포스팅은 room에 관해 포스팅 해 보았습니다.
처음은 물론 낯설고 어색하겠지만, 배우고 나면 굳이 저수준의 sqlite를 쓸 이유가 없어지니 필수라 할 수 있겠네요.
더 자세한 내용은 공식 문서를 참조하세요!
https://developer.android.com/training/data-storage/room?hl=ko
'IDE & Framework > Android' 카테고리의 다른 글
[Kotlin] doze모드 방지, 절전모드 방지 하도록 요청하기 (0) | 2022.05.13 |
---|---|
[짧] Android aar에 application proguard 규칙 적용시키기 (0) | 2022.04.07 |
[Kotlin]Android Firebase Cloud Message(FCM) - (1) Client (0) | 2022.02.26 |
Android Log 라이브러리 Timber (0) | 2022.02.24 |
Android Log 라이브러리 Logger (0) | 2022.02.24 |