이번에는 안드로이드 앱을 개발하면서 DB를 사용할 때 활용할 수 있는 Room DB에 대해서 알아보자.
Room DB(DataBase)
- AAC(Android Architecture Component) 중 하나이다.
- ACC는 앱을 견고하고, 실험 가능하고, 유지보수성이 뛰어나도록 만들어주는 라이브러리 모음이다.
- Room은 SQLite DB를 모두 사용할 수 있고 더 쉽게 사용할 수 있도록 하는 라이브러리이다.
- ACC중 하나이기 때문에 다른 구성요소인 LiveData, ViewModel 등의 Component을 함께 사용하여 아주 간편하게 DB를 관리하고 UI를 갱신할 수 있다.
Room DB 구성요소
- Entity: 데이터베이스 안의 테이블을 클래스로 나타낸 것이다.
- DAO(Database Access Object): 데이터베이스에 접근하는 함수(insert, delete.. 등)를 포함한다.
- Database: 앱에 영구 저장되는 데이터와 기본 연결을 위한 주 액세스 지점이다.
Gradle 설정
우선 프로젝트를 하나 생성하고 build.gradle(Module) 파일에 다음 코드를 적고 우측 상단에 있는 'Sync Now'를 누른다.
plugins {
...
}
apply plugin: 'kotlin-kapt'
...
dependencies {
...
// Room components
def roomVersion = '2.2.5'
implementation "androidx.room:room-runtime:$roomVersion"
kapt "androidx.room:room-compiler:$roomVersion"
implementation "androidx.room:room-ktx:$roomVersion"
androidTestImplementation "androidx.room:room-testing:$roomVersion"
// Kotlin components
def coroutines = '1.3.4'
def kotlin_version = "1.3.72"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
api "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines"
api "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines"
}
Entity 생성
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity
data class Entity (
var title : String
){
@PrimaryKey(autoGenerate = true)// PrimaryKey 를 자동적으로 생성
var id: Int = 0
}
DAO 생성
@Dao
interface DAO {
// 데이터 베이스 불러오기
@Query("SELECT * from entity")
fun getAll(): LiveData<List<Entity>>
// 데이터 베이스 추가
@Insert
fun insert(entity: Entity)
}
AppDatabase 생성
import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import kotlinx.coroutines.CoroutineScope
@Database(entities = [Entity::class], version = 1, exportSchema = false)
abstract class AppDatabase : RoomDatabase() {
abstract fun dao(): DAO
}
Room을 실질적으로 구현하는 부분
MainActivity
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)
// db 연결
val db = Room.databaseBuilder(
applicationContext, AppDatabase::class.java, "database"
).allowMainThreadQueries().build()
// db에 저장된 데이터 불러오기
db.dao().getAll().observe(this, Observer { todos ->
result_text.text = todos.toString()
})
// 글을 쓰고 버튼을 누르면 db에 저장
button.setOnClickListener{
db.dao().insert(Entity(edit.text.toString()))
}
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_margin="10dp">
<EditText
android:layout_weight="1"
android:id="@+id/edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView"
android:ems="10"
android:inputType="textPersonName"
android:hint="할 일"/>
<Button
android:text="button"
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="match_parent">
</Button>
</LinearLayout>
<TextView
android:id="@+id/result_text"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</LinearLayout>
위 코드를 모두 작성하고 실행하면 다음 결과 영상과 같이 나오는 것을 확인할 수 있다.
참고
github
'Develop > Kotlin' 카테고리의 다른 글
[kotlin] 코틀린 Android MVVM 패턴 구현 (3) | 2021.08.30 |
---|---|
[Android] 안드로이드 앱 배포 시 필요한 이미지 (0) | 2021.08.27 |
[kotlin] 코틀린 Android 현재 위치를 GPS 좌표로 구하기 (0) | 2021.08.13 |
[kotlin] 코틀린 Android 공공데이터 오픈 API 활용(JSON 문서) (0) | 2021.08.08 |
[kotlin] 코틀린 Android 공공데이터 오픈 API 활용(XML 문서) (3) | 2021.08.04 |