intert, delete, update
SQL은 자동으로 만들어주며, 복잡함 SQL은 직접 만들 수 있음plugins {
....
id 'kotlin-kapt'
}
.....
dependencies {
......
def room_version = "2.5.1"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
kapt "androidx.room:room-compiler:$room_version"
// optional - Kotlin Extensions and Coroutines support for Room
implementation "androidx.room:room-ktx:$room_version"
// optional - Test helpers
testImplementation "androidx.room:room-testing:$room_version"
}
Room은 데이터베이스 내부의 각 항목을 프로그램에서 사용하기 위해 Object Relational Mapping 이라는 과정을 통해서 객체로 변환을 하는데, 이 변환을 위해 Entity를 정의해서 사용하게 된다.
@Entity(tableName = "student_table") // 테이블 이름
data class Student (
@PrimaryKey
@ColumnInfo(name = "student_id")
val id: Int,
val name: String
)
데이터베이스는 쿼리를 가능한 사용하지 않고, DAO를 써서 간접적으로 조작하게 된다.
@Insert, @Update, @Delete, @Query
가 있음@Query("SELECT * from table") fun getAllData() : List<Data>
@Query("SELECT * from table") fun getAllData() : LiveData<List<Data>>
@Query("SELECT * FROM student_table WHERE name = :sname")
suspend fun getStudentByName(sname: String): List<Studnet>
데이터베이스 객체를 만들어서 엔티티에 대한 다오를 이 객체가 주관하도록 한다. 이런 구조를 구축함으로써 사용자가 데이터베이스 파일에 직접 접근하지 않고 SQL Query 사용을 최소화 하면서 조작 그자체를 추상화 할 수 있따.
myDao = MyDatabase.getDatabase(this).getMyDao()
runBlocking {
myDao.insertStudent(Student(1, "james"))
}
val allStudents = myDao.getAllStudents()
val allStudents = myDao.getAllStudents()
allStudents.observe(this) { // Observer::onChanged() 는 SAM 이기 때문에 lambda로 대체
val str = StringBuilder().apply {
for ((id, name) in it) {
append(id)
append("-")
append(name)
append("\n")
}
}.toString()
binding.textStudentList.text = str
}