본문 바로가기
개발/Android

[Android] 스마트폰 내장 DB를 사용하기 위한 Room 1탄

by tempus 2021. 8. 8.
반응형

🔶 Room 이란?

Android App에서 SQLite 데이터베이스를 쉽고 편리하고 쉽게 사용할 수 있게 해주는 라이브러리입니다. 보통 스마트폰 내장 DB에 데이터를 저장하고 싶을 때 많이 사용합니다.

DAO, Entity, RoomDatabase로 구성되어 있다. 구조는 아래와 같습니다.

 

room_structure
Room 구조 

Dependency는 아래의 페이지로 들어가 확인할 수 있습니다.

https://developer.android.com/jetpack/androidx/releases/room

 

Room  |  Android 개발자  |  Android Developers

Room Room 지속성 라이브러리는 SQLite에 추상화 레이어를 제공하여 SQLite를 완벽히 활용하면서 더 견고한 데이터베이스 액세스를 가능하게 합니다. 최근 업데이트 현재 안정화 버전 다음 버전 후보

developer.android.com

🔶 Entity

Entity는 테이블로 만들고 싶은 객체에 annotation으로 Entity를 선언하고 테이블 네임을 설정해줍니다.

@PrimaryKey를 사용하여 primary key를 만들 수 있고 autoGenerate를 통해 자동으로 값을 생성해 줄 수 있습니다. @ColumnInfo(name = "칼럼 이름")을 사용하여 변수 이름과 다르게 table 변수를 지정할 수 있습니다.


@Entity(tableName = "userInfo")
data class User(
  @PrimaryKey(autoGenerate = true)
  var id: String,

  @ColumnInfo(name = "name")
  var name: String,

  @ColumnInfo(name = "birth")
  var birth: String,
)

🔶 Dao

데이터에 접근할 수 있는 메써드를 정의해 놓는 인터페이스입니다. 각각의 annotation을 붙여서 그 기능을 정의할 수 있는데

  • @Insert : 테이블에 데이터 삽입
  • @Update : 테이블에 데이터 수정
  • @Delete : 테이블에 데이터 삭제
  • @Query : 그 외에 특정 쿼리문을 실행해 결과를 얻고 싶을 때 사용
  • (onConflict = OnConflictStrategy.REPLACE) 은 Insert할 시 PrimaryKey 값이 이미 존재하면 데이터를 갱신한다는 의미입니다.

@Dao
interface UserDao {

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

   @Insert(onConflict = OnConflictStrategy.REPLACE)
   fun insert(user: User)

   @Update
   fun update(user: User)

   @Delete
   fun delete(user: User)
}

🔶 Room Database

Room Database는 데이터베이스를 생성하고 관리하는 데이터베이스 객체 만들기 위해서 만드는 추상 클래스입니다.

version은 앱을 업데이트하다가 기존 Entity 구조를 변경해야 하는 일이 발생할 때 구분해주는 역할을 해줍니다.


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

  companion object {
      private var INSTANCE: StockTradeItemDatabase? = null

        @Synchronized
        fun getInstance(context: Context): RoomDatabase? {
            if (INSTANCE == null) {

         INSTANCE=Room.databaseBuilder(context.applicationContext,
                        UserDatabase::class.java, "user_database")
                        .fallbackToDestructiveMigration()
                        .allowMainThreadQueries()
                        .build()
            }
            return INSTANCE
        }
  }
}

만약 하나의 데이터베이스에 여러 개 Entity를 추가해야 한다면 arrayof()를 통해 넣어주면 됩니다.


@Database(entities = arrayOf(User::class, Student::class), version = 1)
abstract class UserDatabase: RoomDatabase() {
    abstract fun userDao(): UserDao
}
반응형

댓글


loading