Room DB에 대해

최희창·2022년 6월 14일
0

Android AAC

목록 보기
4/13

Room DB란?

  • Room은 스마트폰 내장 DB에 데이터를 저장하기 위해 사용하는 ORM(Object Relational Mapping)라이브러리입니다. 쉽게 말해서, Room은 데이터베이스의 객체를 코틀린(or 자바)의 객체로 매핑해주는 역할을 합니다.

Room DB 사용 이유

  • SQLite와의 차이점으로 설명드립니다.
  1. SQLite의 경우 쿼리에 대한 에러를 컴파일에 확인하는 것이 없지만 Room에서는 컴파일 도중 SQL에 대한 유효성을 검사할 수 있습니다.
  2. Boilter Plate 코드를 줄일 수 있습니다.
  3. Room의 경우 LiveData와 RxJava를 위한 Observation으로 생성하여 동작할 수 있습니다.

Room의 구조

  • Room은 3가지 구성요소(Database, Entity, Dao)로 구성되어 있습니다.
  • Database : 앱에 영구저장되는 데이터와 기본 연결을 위한 주 액세스 지점이다.
  • Entity : 데이터베이스 안의 테이블을 클래스로 나타낸 것입니다.
  • Dao(Database Access Object) : 데이터베이스에 접근하는데 사용되는 메서드들을 포함합니다.

코드 예제

1. Gradle 설정

    id 'kotlin-kapt'

    //RoomDB
    implementation "androidx.room:room-ktx:2.3.0"
    implementation "androidx.room:room-runtime:2.3.0"
    kapt "androidx.room:room-compiler:2.3.0"

2. Entity 설정

@Entity
data class LoginEntity(
    val username: String,
    val password: String
) {
    @PrimaryKey(autoGenerate = true) var id: Int = 0
}

3. Dao 설정

@Dao
interface LoginDao {

    @Query("Select * From LoginEntity")
    fun getLogin() : LoginEntity

    @Query("DELETE From LoginEntity")
    fun deleteLogin()

    @Insert
    fun insetLogin(loginEntity: LoginEntity)

}

4. Database 설정

@Database(
    entities = [LoginEntity::class],
    version = 1,
    exportSchema = false
)
abstract class LoginDatabase: RoomDatabase() {
    abstract fun loginDao() : LoginDao

    companion object {
        private var instance: LoginDatabase? = null

        @Synchronized
        fun getInstance(context: Context): LoginDatabase? {
            if (instance == null) {
                synchronized(LoginDatabase::class) {
                    instance = Room.databaseBuilder(
                        context.applicationContext,
                        LoginDatabase::class.java,
                        "login-database"
                    )
                        .build()
                }
            }
            return instance
        }
    }
}

5. 사용

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding
    private lateinit var db: LoginDatabase

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        db = LoginDatabase.getInstance(applicationContext)!!
        refreshLogin()

        binding.btn.setOnClickListener {
            addLogin()
            refreshLogin()
            startLogin()
        }
    }

    private fun addLogin() {
        val username = binding.etID.text.toString()
        val password = binding.etPW.text.toString()

        CoroutineScope(Dispatchers.IO).launch {
            db.loginDao().insetLogin(LoginEntity(username, password))
        }
    }

    private fun refreshLogin() {
        CoroutineScope(Dispatchers.Main).launch {
            val data = CoroutineScope(Dispatchers.IO).async {
                db.loginDao().getLogin()
            }.await()

            if(data != null) {
                binding.etID.setText("${data.username}")
                binding.etPW.setText("${data.password}")
            }
        }
    }
}

TypeConverter :
https://velog.io/@chc0331/TypeConverter

profile
heec.choi

0개의 댓글