확장 함수
// String을 확장하는 확장 함수 isNumber
fun String.isNumber(): {
}
: 객체 이름.함수명과 같이 사용하게 되면 그 객체를 확장하는 확장 함수가 되고, 마치 객체의 멤버 함수인 것처럼 사용할 수 있다.
예) 확장함수의 구현
fun String.isNumber(): Boolean {
return try {
this.toBigInteger()
true
} catch (e: NumberFormatException) {
false
}
}
: String이 숫자인지 아닌지 판별하는 확장 함수로, try-catch문을 사용했다.
Room을 통해 로컬 데이터베이스 구현하기
1. app 모듈의 build.gradle에 아래 코드 추가하고 Sync
apply plugin: 'kotlin-kapt'
dependencies {
...
implementation "androidx.room:room-runtime:2.2.6"
kapt "androidx.room:room-compiler:2.2.6"
}
2. AppDatabase라는 abstarct class를 생성해서 데이터베이스를 선언
import androidx.room.Database
import androidx.room.RoomDatabase
import com.naram.calculator.dao.HistoryDAO
import com.naram.calculator.model.History
@Database(entities = [History::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun historyDAO(): HistoryDAO
// AppDatabase를 생성할 때 HistoryDAO를 가져와서 생성할 수 있도록
}
3. DAO를 interface 형식으로 구현하고 @Dao를 붙여서 사용
import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.Query
import com.rit.calculator.model.History
@Dao
interface HistoryDAO {
@Query("SELECT * FROM history")
fun getAll(): List<History>
@Insert
fun insertHistory(history: History)
@Query("DELETE FROM history")
fun deleteAll()
// 모든 history 삭제
}
4. 데이터베이스에서 사용될 Entitiy를 data class 형식으로 생성한 뒤, @Entity를 붙여 사용
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity
data class History (
@PrimaryKey val uid: Int?,
@ColumnInfo(name = "expression") val expression: String?,
@ColumnInfo(name = "result") val result: String
// 컬럼값 설정
)
5. 생성한 데이터베이스 인스턴스를 가져옴
lateinit var db: AppDatabase
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// onCreate가 되는 시점에 db에 AppDatabase가 만들어져서 할당된다.
db = Room.databaseBuilder(
applicationContext,
AppDatabase::class.java,
"historyDB"
).build()
}
6. Thread에서 데이터베이스를 실행
Thread(Runnable {
db.historyDAO().getAll().reversed().forEach {
// db에서 getAll()을 통해 가져온 row들을 reversed()를 통해 최신순으로 본다.
// forEach문을 통해 가져온 각각의 row : it(History)
runOnUiThread {
val historyView = LayoutInflater.from(this).inflate(R.layout.history_row, null, false)
historyView.findViewById<TextView>(R.id.tv_expression).text = it.expression
historyView.findViewById<TextView>(R.id.tv_result).text = "= ${it.result}"
ll_history.addView(historyView)
}
}
}).start()
반응형
'Programando > Android' 카테고리의 다른 글
[Android/Kotlin] ViewPager2, Remote Config_(7) (0) | 2021.08.21 |
---|---|
[Android/Kotlin] 기기 권한 받아오기_(6) (0) | 2021.06.22 |
[Android/Kotlin] SharePreferences, Thread_(4) (0) | 2021.06.13 |
[Android/Kotlin] Apply, TextView_(3) (0) | 2021.06.12 |
[Android/Kotlin] Collections_(2) (0) | 2021.06.12 |