개발 공부/안드로이드

android Room 1 - 알아보기

yong_DD 2022. 7. 3. 15:49

1. 기본 설정

build.gradle(Module) 추가

plugins {
   ...
    id 'kotlin-kapt' // 추가
}

dependencies {
   ...  //2022-04-25 기준
    implementation "androidx.room:room-runtime:2.4.2"
    kapt "androidx.room:room-compiler:2.4.2"
}

2. Room의 기본 구성요소

데이터 항목, 데이터 액세스 객체(DAO), 데이터베이스 클래스

2-1 데이터 항목

저장하려는 객체를 나타내는 항목으로 데이터베이스의 한 행에 저장하려는 값을 말한다.

1개 이상의 PrimaryKey가 필요하다

@Entity
data class User(
    @PrimaryKey val id: Int,
    val firstName: String?,
    val lastName: String?
)

기본적으로 클래스 이름을 데이터베이스 테이블 이름으로, 필드 이름을 데이터베이스 열 이름으로 사용하기 때문에 테이블 이름을 다르게 하고 싶다면 @Entitiy의 주석 tableName, @ColumnInfo를 사용해야한다.

@Entity(tableName = "users")
data class User (
    @PrimaryKey val id: Int,
    @ColumnInfo(name = "first_name") val firstName: String?,
    @ColumnInfo(name = "last_name") val lastName: String?
)

 

2-2 데이터 액세스 객체(DAO)

데이터베이스의 데이터를 쿼리 , 업데이트, 삽입, 삭제하는 데 사용할 수 있는 메서드 제공

쿼리를 동작시키는 부분

@Dao
interface UserDao {
    @Insert
    fun insertUser(user: User)

    @Insert
    fun insertAll(vararg users: User)

    @Delete
    fun delete(user: User)

    @Query("DELETE FROM user")
    fun deleteAll()

    @Query("SELECT * FROM user")
    fun getAll(): List<User>
}

* varargs[가변인자] - 인수를 원하는 수만큼 받는 매서드를 만듦

https://developer88.tistory.com/322

 

vararg 로 가변 인자를 전달하는 방법 #Kotlin

Kotlin에서 n개의 가변되는 인자를 전달하는 방법은 어떻게 표현할 수 있을까요? 오늘은 이 방법에 대해서 정리해 보도록 하겠습니다. 1. 가변인자 가변인자는 인자의 수가 유동적인 경우에 사용

developer88.tistory.com

 

2-3 데이터베이스 클래스

데이터베이스를 보유하고 앱의 영구 데이터와 기본 연결을 위한 액세스 포인트 역할

RoomDataBase를 상속 받아 databaseBuilder를 통해 Dao에 접근하고 그를 통해 데이터에 접근할 수 있도록 함

@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase(){
    abstract fun userDao():UserDao
}

데이터베이스 객체는 싱글톤으로 선언하는 것이 바람직하다.

(접근할 때마다 객체 생성하면 많은 비용이 들 뿐만아니라 단일 프로세스 내에서 여러 인스턴스에 액세스할 필요가 없음.)

 

    companion object {
        @Volatile // Multi-Thread safe 하도록 Volatile 선언
        private var instance: AppDatabase? = null


        fun getInstance(context: Context): AppDatabase {
            synchronized(this) {
                var instance = instance

                if (instance == null) {
                    instance = Room.databaseBuilder(
                        context.applicationContext,
                        AppDatabase::class.java,
                        "user.db" // DB 파일 이름
                    )
                        .fallbackToDestructiveMigration()
                        .build()
                    this.instance = instance
                }
                return instance
            }
        }
    }

 

 

https://genius-dev.tistory.com/entry/Android-Room%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-%EB%A1%9C%EC%BB%AC-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%A0%80%EC%9E%A5%ED%95%98%EA%B8%B0

 

[Android] Room을 이용하여 로컬 데이터베이스 저장하기

🧐 Room?  로컬 데이터베이스를 이용하는 방법 중 하나는 안드로이드에서 기본적으로 제공하는 데이터베이스인 SQLite가 있다. 하지만 구글에서 2017년 AAC(Android Architecture Components)를 내놓음으로 SQ

genius-dev.tistory.com

https://cocoslime.github.io/blog/Room/

 

[Android] Jetpack Room 라이브러리

Kotlin에서의 Room 라이브러리 사용법

cocoslime.github.io

[전체 참고]

https://developer.android.com/training/data-storage/room?hl=ko