안드로이드) Room Database

밍나·2022년 3월 8일
0

Android

목록 보기
29/36

✏️ Room Database란

  • 안드로이드 앱에서 로컬 DB를 사용해야 할 때 이전에는 SQLite를 사용했다.
  • Room은 AAC(Android Architecture Components)의 하나로 지금은 안드로이드 앱의 DB 사용을 Room으로 권고하고 있다.
  • Room은 코드 작성을 편하게 하기 위해 SQLite를 추상화한 라이브러리로 내부적으로는 SQLite 이용하고 있어 함수에 정보만 주면 쉽게 로컬 DB를 사용할 수 있다.

✏️ Room Database 사용 방법

1. dependency 설정

plugins {
   ...
   id 'kotlin-kapt'
}

...

dependencies {
    def room_version = "최신 버전"
    implementation "androidx.room:room-runtime:$room_version"
    kapt "androidx.room:room-compiler:$room_version"
    implementation "androidx.room:room-ktx:$room_version"
    ...
}

2. Database Entity 생성

  • 데이터베이스에서 Entity는 개념 스키마를 뜻하며, 테이블이라고 생각하면 된다.
import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity
data class User (
    @PrimaryKey(autoGenerate = true)
    var id: Int = 0, // 고유 ID값
    var name: String = "",
    var age: String = ""
)
  • 기본키에는 @PrimaryKey 어노테이션을 붙인다.
  • 기본키를 고유 ID 값으로 지정해 데이터가 생성될 때마다 자동으로 고유 ID 값이 1씩 증가하면서 생성될 수 있도록 (autoGenerate=true)로 지정한다.
  • 코틀린에서는 data class를 사용하여 getter/setter를 따로 구현할 필요가 없다.

3. DAO(Data Access Object) 생성

  • 데이터베이스에 접근하는 메소드(삽입, 삭제, 수정 등)로 구성된 DAO(Data Access Object) 인터페이스 생성한다.
import androidx.room.*

@Dao
interface UserDao {

    @Insert
    fun setInsertUser(user: User)

    @Update
    fun setUpdateUser(user: User)

    @Delete
    fun setDeleteUser(user: User)

    @Query("SELECT * FROM User")
    fun getUserAll(): List<User>

}
  • @Insert, @Update, @Delete 어노테이션은 각각 삽입, 수정, 삭제로 쿼리를 작성하지 않고 간편하게 데이터를 처리할 수 있다. 이 때 함수의 매개변수는 위에서 정의한 Entity를 사용해야 한다.
  • 데이터베이스 조회(Select)나 복잡한 쿼리를 사용해야 할 때는 @Query 어노테이션을 사용해 직접 쿼리를 작성한다.

4. Database 생성

  • RoomDatabase를 상속 받은 UserDatabase를 생성한다.
import androidx.room.Database
import androidx.room.RoomDatabase

@Database(entities = [User::class], version = 1)
abstract class UserDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}
  • @Database 어노테이션은 데이터베이스와 연결되는 entity와 데이터베이스 항목이 변하는 경우 바꿔줘야 하는 버전을 작성한다.
  • 이 때 데이터베이스는 추상 클래스로 작성해야 하며 반환값이 DAO인 매개 변수가 없는 추상 메서드를 포함해야 한다.

5. 코드에서 사용하기

1) DB 객체 생성

val database = Room.databaseBuilder(
        applicationContext, 
        UserDatabase::class.java, 
        "minha_db"
    ).fallbackToDestructiveMigration()
    .allowMainThreadQueries()
    .build()

// 인터페이스 객체 할당
mUserDao = database.userDao()
  • Room.databaseBuilder의 매개변수
    • Context : 보통 applicationContext
    • Class : @Database로 어노테이션된 추상 클래스
    • name : 데이터베이스 파일 이름(개발자 지정)
  • fallbackToDestructiveMigration() : 스키마(Database) 버전 변경 가능
  • allowMainThreadQueries() : Main Thread에서 DB에 입출력을 가능하게 함

2) DB 사용

// insert
val user1 = User()
user1.name = "minha"
user1.age = "25"
mUserDao.setInsertUser(user1)

// update
val user2 = User()
user2.id = 1
user2.name = "gildong"
user2.age = "33"
mUserDao.setUpdateUser(user2)

// delete
val user3 = User()
user3.id = 2
mUserDao.setDeleteUser(user3)

// select
val userList = mUserDao.getUserAll()

for(user in userList) {
    binding.tvResult.append("name : ${user.name}, age : ${user.age}\n")
}

✏️ 결과물

profile
🤗🤗🤗

0개의 댓글