👍 Room이란?

안드로이드 앱에서 SQLite 데이터베이스를 쉽고 편리하게 사용할 수 있도록 하는 라이브러리이다.
Room은 Entity, Dao, RoomDatabase 3가지 요소로 구성된다.

blog_-android-room_architecture-1.png

✌ Dependency 추가하기

implementation "androidx.room:room-runtime:2.2.0-alpha02"
testImplementation "androidx.room:room-testing:2.2.0-alpha02"
kapt "androidx.room:room-compiler:2.2.0-alpha02"
annotationProcessor "androidx.room:room-compiler:2.2.0-alpha02"
implementation "androidx.room:room-rxjava2:2.2.0-alpha02"
implementation "androidx.room:room-guava:2.2.0-alpha02"

최신버전은 이곳 에서 확인할 수 있다.

👌 Entity

@Entity(tableName = "user_table")
class User(@field:PrimaryKey
           var id: String,
           var name: String,
           var birth: String,
           var gender: String,
           var phoneNumber: String,
           var picture: String?,
           var intro: String?,
           var scope: String,
           var point: Int)

Entity 즉 테이블로 만들고 싶은 객체에 어노테이션으로 Entity를 선언하고 tableName을 지정해 준다.
@field:PrimaryKey를 사용하여 PrimaryKey를 만들 수도 있고
@field:ColumnInfo(name = "컬럼이름")를 사용하여 객체의 변수이름과 다르게 table 변수를 지정할 수도 있다.

👏 Dao

@Dao
interface BaseDao<ET> {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insert(entity: ET)

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insert(entity: Array<out ET>)

    @Update
    fun update(entity: ET)

    @Delete
    fun delete(entity: ET)

}
@Dao
interface UserDao : BaseDao<User> {

    @Query("SELECT * FROM user_table WHERE id=:id")
    fun getUser(id: String?): LiveData<User>
}

Dao 어노테이션과 Insert, Update, Delete, Query 어노테이션을 이용하여 만들어 준다.
insert, update, delete를 BaseDao에 만들어주고
Query문을 작성해야 하는 이벤트의 경우엔 BaseDao를 상속받는 객체에 넣어준다.

  • onConflict = OnConflictStrategy.REPLACE는 Insert 할때 PrimaryKey가 겹치는 것이 있으면 덮어 쓴다는 의미이다.

🙌 RoomDatabase

@Database(entities = [User::class], version = 1, exportSchema = false)
abstract class RoomDatabase : androidx.room.RoomDatabase() {

    abstract fun userDao(): UserDao

    companion object {

        private var instance: RoomDatabase? = null

        @Synchronized
        fun getInstance(context: Context): RoomDatabase? {
            if (instance == null) {
                instance = Room.databaseBuilder(context.applicationContext,
                        RoomDatabase::class.java, "weknot_database")
                        .fallbackToDestructiveMigration()
                        .allowMainThreadQueries()
                        .build()
            }
            return instance
        }
    }
}

RoomDatabase에서 데이터베이스를 생성하고 버전을 관리 한다.