본문 바로가기
Programando/Android

[Android/Kotlin] Room_(5)

확장 함수

// 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()
반응형