Develop/Kotlin

[kotlin] 코틀린 Android Room DB 활용

JunJangE 2021. 8. 26. 18:06

이번에는 안드로이드 앱을 개발하면서 DB를 사용할 때 활용할 수 있는 Room DB에 대해서 알아보자.

Room DB(DataBase)

- AAC(Android Architecture Component) 중 하나이다.

- ACC는 앱을 견고하고, 실험 가능하고, 유지보수성이 뛰어나도록 만들어주는 라이브러리 모음이다.

- Room은 SQLite DB를 모두 사용할 수 있고 더 쉽게 사용할 수 있도록 하는 라이브러리이다.

- ACC중 하나이기 때문에 다른 구성요소인 LiveData, ViewModel 등의 Component을 함께 사용하여 아주 간편하게 DB를 관리하고 UI를 갱신할 수 있다.

Room DB 구성요소

 Room 아키텍처 다이어그램

- 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>

위 코드를 모두 작성하고 실행하면 다음 결과 영상과 같이 나오는 것을 확인할 수 있다.

<결과 영상>

참고

 

Room을 사용하여 로컬 데이터베이스에 데이터 저장  |  Android 개발자  |  Android Developers

Room 라이브러리를 사용하여 더 쉽게 데이터를 유지하는 방법 알아보기

developer.android.com

 

 

Room 항목을 사용하여 데이터 정의  |  Android 개발자  |  Android Developers

Room 라이브러리의 일부인 항목을 사용하여 데이터베이스 테이블을 생성하는 방법 알아보기

developer.android.com

github

 

GitHub - junjange/Kotlin-Learning: 코틀린 학습

코틀린 학습. Contribute to junjange/Kotlin-Learning development by creating an account on GitHub.

github.com