Android

Android Room

show2888 2022. 6. 15. 16:38
반응형

Room 이란?

안드로이드는 데이터관리시스템으로 SQLite를 사용하는데 그 위에서 사용할 ORM 라이브러리를 룸이라한다.

즉, 안드로이드 로컬 저장장치를 쉽고 편하게 사용할수 있는 라이브러리

ORM?
DB테이블을 object로 맵핑시키는것

 

Room의 구성요소 3가지

1. Entity

하나의 정보 단위 이자 데이터베이스에 저장할 테이블

 

2. Data Access Object

인터페이스에 메소드를 정의함으로서 데이터베이스를 통해 수행할 작업을 정의한다.

주로 DAO라고함

 

3. Room Database

사용할 데이터베이스

 

Room의 사용방법

1. dependancy 추가

implementation("androidx.room:room-runtime:2.4.2")
kapt("androidx.room:room-compiler:2.4.2")

2. Entity 생성

data class에 @Entity 어노테이션을 추가한다. 

@Entity
data class User(
    var name: String,
    var age: Int
) {
    @PrimaryKey(autoGenerate = true)
    var id: Int = 0
}

@PrimaryKey 어노테이션으로 기본키를 설정하고 autoGenerate 속성을 사용하면 자동적으로 생성된다

@Entity("user") 이런식으로 테이블 이름을 설정 할 수있다. 비어두면 클래스 이름이 적용된다.

 

3. DAO(Data Access Object)  생성

인터페이스에 @Dao 어노테이션을 달아두고 메소드위에 수행할 어노테이션을 설정한다.

@Query() 어노테이션으로 sql쿼리문을 적용 할 수있다.

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

    @Delete
    fun delete(user: User)
    
    @Query("SELECT * FROM User") // 테이블의 모든 값을 가져와라
    fun getAll(): List<User>

    @Query("DELETE FROM User WHERE name = :name") // 'name'에 해당하는 유저를 삭제해라
    fun deleteUserByName(name: String)
}

 

https://blog.mindorks.com/data-access-objects-dao-in-room

위 링크를 통해 DAO를 심도있게 볼 수있다.

 

4. RoomDatabase 생성

abstract클래스 위에 @Database 어노테이션 추가하고 ()안에 엔티티를 정의한다 두개이상이면 콤마로 구분하고 version을 적어준다.

@Database(entities = [User::class, Student::class], version = 1)
abstract class UserDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
      
    companion object {
        private var instance: UserDatabase? = null

        @Synchronized
        fun getInstance(context: Context): UserDatabase? {
            if (instance == null) {
                synchronized(UserDatabase::class) {
                    instance =
                        Room.databaseBuilder(context, UserDatabase::class.java, "user_database")
                            .build()
                }
            }
            return instance
        }
    }
        
}
version?
버전은 엔티티의 구조가 변경되었을 경우를 대비해 구조의 변경을 구분하기 위해쓴다.
구조가 다를때 버전이 같다면 에러가 뜬다.
companion object 사용이유?
구글에서 싱글톤을 권장한다. 인스턴스 생성시 비용이 높고 데이터의 일치성을 위하기 때문


5. 데이터베이스 사용

코루틴을 사용해서 db에 접근후 사용한다.

val newUser = User("이름", 18)

val db = UserDatabase.getInstance(applicationContext)!!

CoroutineScope(Dispatchers.IO).launch {
    db.userDao().insert(newUser)
}

 


기타 팁

https://medium.com/harrythegreat/%EB%B2%88%EC%97%AD-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-room-7%EA%B0%80%EC%A7%80-%EC%9C%A0%EC%9A%A9%ED%95%9C-%ED%8C%81-18252a941e27

 

[번역] 안드로이드 Room 7가지 유용한 팁

본 내용은 원작자의 허락을 맡아 번역한 내용이며 개인적인 커멘츠는 역주로 표기하였습니다.

medium.com

 

 

 

출처 : https://todaycode.tistory.com/39

반응형