계산기의 간단한 기능을 구현할 것이다. 여러 계산이 아닌 1차원적인 계산만을 할 것이라, 후위연산자를 이용한 계산기 구현은 나중에 따로 만들어보도록하겠다.
LayoutInflater는 xml에 정의된 뷰 리소스를 메모리에서 사용할 수 있는 View객체로 반환하는 역할을 한다.
따라서, 뷰 리소스가 정의되어 있는 Xml을 객체화(Objectify) 실제 앱에 사용하고 싶을 때 이 과정을 담당하는 것이 LayoutInflater이다.
Room은 데이터베이스를 다루는 sqlite와 같은 기능을 하지만 내부의 DB를 이용해 다른 쓰레드를 활용하는 방법이다. 순서는 다음과 같다.
@Entity
data class History(
@PrimaryKey val uid: Int?,
@ColumnInfo(name = "expression") val expression: String?,
@ColumnInfo(name = "result") val result: String?
)
implementation "androidx.room:room-runtime:2.2.6"
kapt "androidx.room:room-compiler:2.2.6"
@INSERT 삽입
@DELETE 삭제
@UPDATE 수정
등의 기능이 있고, 검색하거나 다른 세부기능을 원한다면 sql의 문법에 맞게 어노테이션을 붙여 Query를 아래와 같이 선언해야한다.
아래에 작성된 코드를 보면 history에서 모든 데이터를 가져오라는 쿼리를 getAll()의 형태로 History Entity의 List를 불러오는 것을 알 수 있다.
@Dao
//history를 지우고 join하는 것을 관리.
interface HistoryDao {
//모든 history를 검색하는 sql 쿼리문.
@Query("SELECT * FROM history")
fun getAll(): List<History>
//insert하는 메소드
@Insert
fun insertHistory(history: History)
@Query("DELETE FROM history")
fun deleteAll()
/*
@Delete
fun delete(history: History)
//result 조건을 걸고 찾는다. LIMIT 1을 걸면 하나만 반환이 가능하다.
@Query("SELECT * FROM history WHERE result LIKE :result")
fun findByResult(result: String)
*/
}
@Database(entities = [History::class], version = 1)
abstract class AppDataBase : RoomDatabase() {
abstract fun historyDao(): HistoryDao
}
lateinit var db: AppDataBase
db = Room.databaseBuilder(
applicationContext,
AppDataBase::class.java,
"historyDB"
).build()
Thread(Runnable {
db.historyDao().insertHistory(History(null, expressionText, resultText))
}).start()
Thread(Runnable {
db.historyDao().getAll().reversed().forEach {
//LinearLayout안의 view가 없으므로 layoutinflater을 사용한다.
//새로운 쓰레드가 아닌 메인쓰레드로 전환해서 작업해야함.
runOnUiThread {
//root =historyLinearLayout이지만 나중에 add로 붙일것임.
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()
이 room이라는 기능은 처음 접하는데 너무 헷갈리고 어려워 여러번을 다시 조사하고 코드리뷰를 해봤다. 뭐든지 이해하면 그다음에 사용할 때 수월할테니 헛투루 지나치지 않기를 당부한다.