경험의 기록

2021.05.21 - [안드로이드/AAC, MVVM] - [Android] Room DB에서 데이터 검색하기 (Coroutine Flow)

 

[Android] Room DB에서 데이터 검색하기 (Coroutine Flow)

2021.05.20 - [안드로이드/AAC, MVVM] - [Android] Room 활용하여 데이터 읽기, 삽입, 삭제, 수정 - (2) 수정, 삭제 [Android] Room 활용하여 데이터 읽기, 삽입, 삭제, 수정 - (2) 수정, 삭제 2021.05.19 - [안드..

hanyeop.tistory.com

여기에서 사용한 코드를 바탕으로 사용해볼 것이다.

 

 


사용해보기

원본 코드

/* entities = 사용할 엔티티 선언, version = 엔티티 구조 변경 시 구분해주는 역할
   exportSchema = 스키마 내보내기 설정 */
@Database(entities = [User::class], version = 1, exportSchema = false)
abstract class UserDatabase : RoomDatabase() {

    abstract fun userDao() : UserDao

    companion object{
        /* @Volatile = 접근가능한 변수의 값을 cache를 통해 사용하지 않고
        thread가 직접 main memory에 접근 하게하여 동기화. */
        @Volatile
        private var instance : UserDatabase? = null

        // 싱글톤으로 생성 (자주 생성 시 성능 손해). 이미 존재할 경우 생성하지 않고 바로 반환
        fun getDatabase(context : Context) : UserDatabase? {
            if(instance == null){
                synchronized(UserDatabase::class){
                    instance = Room.databaseBuilder(
                        context.applicationContext,
                        UserDatabase::class.java,
                        "user_database"
                    ).build()
                }
            }
            return instance
        }
    }
}

데이터베이스를 생성해주는 기본적인 코드이다.

여기에서

 

Database

// 싱글톤으로 생성 (자주 생성 시 성능 손해). 이미 존재할 경우 생성하지 않고 바로 반환
        fun getDatabase(context : Context) : UserDatabase? {
            if(instance == null){
                synchronized(UserDatabase::class){
                    instance = Room.databaseBuilder(
                        context.applicationContext,
                        UserDatabase::class.java,
                        "user_database"
                    ).addCallback(object : RoomDatabase.Callback(){
                        override fun onCreate(db: SupportSQLiteDatabase) {
                            super.onCreate(db)
                            fillInDb(context.applicationContext)
                        }
                    }).build()
                }
            }
            return instance
        }

addCallback 메소드로 onCreate를 작성하면

최초 데이터베이스 생성시의 작업을 선언해줄 수 있다.

fillIndb라는 메소드를 따로 작성할 것이다.

 

Dao

@Dao
interface UserDao {

   @Insert
   suspend fun addUserDb(users : List<User>)

}

Dao에서 데이터의 List를 추가하는 메소드를 추가해준다.

 

 

Database

// 데이터 미리 채우기
        fun fillInDb(context: Context){
            CoroutineScope(Dispatchers.IO).launch {
                getDatabase(context)!!.userDao().addUserDb(
                    USER_DATA
                )
            }
        }

이제 fillInDb 메소드를 구현해주는데

코루틴으로 아까 만든 Dao 메소드를 사용하여 DB를 삽입한다.

 

private val USER_DATA = arrayListOf(
    User(0,"Han",20),
    User(0,"Lee",25)
)

관리하기 위하여 DATA는 따로 빼 놓았다.

 

실행해보면

데이터가 잘 들어간 것을 확인할 수 있다.

 

전체코드

https://github.com/HanYeop/AndroidStudio-Practice/tree/master/RoomEx

 

HanYeop/AndroidStudio-Practice

(~2021.05.20) 안드로이드 학습 내용 저장소. Contribute to HanYeop/AndroidStudio-Practice development by creating an account on GitHub.

github.com

 

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading