Room은 orm(object relational mapping)라이브러리입니다. 쉽게 말해 Room은 데이터베이스의 객체를 코틀린 or 자바 객체로 매핑해주는것입니다.
ROOM은 SQLite의 추상레이어 위에 제공하고 있으며 SQLite의 모든 기능을 제공하면서 편한 데이터베이스의 접근을 허용합니다.
적은 양의 데이터는 로컬에서 데이터를 유지하면 큰 이점을 얻을 수 있습니다. 일반적으로 장치가 네트워크에 엑세스 할 수 없을 경우에도 사용자가 오프라인으로 컨텐츠를 탐색할 수 있도록 관련 데이터를 캐시하는 것입니다. Room 라이브러리는 SQlite를 추상화 하여 Sql의 모든 기능을 활용하면서 데이터베이승 액세를 원활하게 수행할 수 있도록 합니다. 공식 문서에서는 반복적이고 에러 유발을 최소화 하는 annotation과 마이그레이션을 하기 쉽다는 이유로 sqlite보다 room 라이브러리를 쓰는 것을 추천하고 있습니다.
Database (데이터베이스) : 저장하는 데이터의 집합 단위를 말합니다.
Entity (항목) : 데이터베이스 내의 테이블을 의미합니다.
DAO (다오):데이터베이스에 접근하는 함수 메소드(insert, update, delete, ...)를 제공합니다
room
을 사용하기 위해서는 build.grdle
: app 에 아래의 코드를 넣어야 합니다.
dependencies {
def room_version = "2.2.6"
implementation "androidx.room:room-runtime:$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"
}
저는 공식문서에서 하라는 대로 했을 뿐인데 오류가 났는데요.
kapt에서 오류가 났습니다. kapt가 오류가 난다면 plugins에서 'id kotlin-kapt'을 추가해보세요.
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-android-extensions'
id 'kotlin-kapt' // 요걸 추가해야합니다.
}
package com.example.roomdatabase2
import androidx.room.*
@Dao
interface TodoDao {
@Query("SELECT * FROM Todo")
fun getAll() : List<Todo>
@Delete
fun delte(todo: Todo)
@Update
fun update(todo: Todo)
@Insert
fun insert(todo: Todo)
}
package com.example.roomdatabase2
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity
TodoList
data class Todo( var title: String ) {
// 고유한 키값 부여
@PrimaryKey(autoGenerate = true) var id: Int = 0
}
// AppDataBase
package com.example.roomdatabase2
import androidx.room.Database
import androidx.room.RoomDatabase
@Database(entities = arrayOf(Todo::class), version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun todoDao(): TodoDao
}
package com.example.roomdatabase2
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.lifecycle.Observer
import androidx.room.Room
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val db = Room.databaseBuilder(
applicationContext,
AppDatabase::class.java, "database-name"
).allowMainThreadQueries().build()
// allowMainThreadQueries를 추가하지 않으면 메인쓰레드에서 db에 접
근할 수 없다.
// 변경된 내용이 여기로 들어가게 된다.
text.text = db.todoDao().getAll().toString()
// 버튼을 눌렀을 text가 추가 되도록 설정
button.setOnClickListener {
db.todoDao().insert(Todo(et_input.text.toString()))
text.text = db.todoDao().getAll().toString()
}
}
}