
Room에 초기데이터를 설정해서 그 데이터로 앱에 목록을 뿌려주려고하는데..
이게 만들다 보니 제가 설정한 것과 조금 달라서 여쭈어봅니다.
현재 위 화면의 운동 목록 데이터들을 그냥 strings 파일에 <string-array> 형식으로 저장해놓고
viewmodel에서 가져다와 쓰고 있거든요..
근데 저는 현재 strings 파일에 이 운동 데이터들이 있는게 꼴보기싫어서(너무 길고 지저분)해서
DB에 초기데이터로 저장후에 불러와서 사용할 예정이었는데
DB 초기데이터 설정관련 샘플 코드들을 보는데..
죄다 결국은 클래스 파일 내에서 데이터를 생성해서 insert하더라구요..
예시1
@Module
class DatabaseModule {
@Provides
fun provideDatabase(context: Context):AppDatabase{
return Room.databaseBuilder(context, AppDatabase::class.java, "event.db")
.addCallback(object: RoomDatabase.Callback(){
override fun onCreate(db: SupportSQLiteDatabase) {
super.onCreate(db)
db.execSQL("insert into category (name, color) values ('수면', '#123456');")
db.execSQL("insert into category (name, color) values ('공부', '#456789');")
db.execSQL("insert into category (name, color) values ('운동', '#A98765');")
}
})
.build()
}
}
예시2
fun fillInDb(context: Context){
CoroutineScope(Dispatchers.IO).launch {
getDatabase(context)!!.userDao().addUserDb(
USER_DATA
)
}
}
private val USER_DATA = arrayListOf(
User(0,"Han",20),
User(0,"Lee",25)
)
예시3
private fun buildDatabase(context: Context) =
Room.databaseBuilder(context.applicationContext,
DataDatabase::class.java, "Sample.db")
// prepopulate the database after onCreate was called
.addCallback(object : Callback() {
override fun onCreate(db: SupportSQLiteDatabase) {
super.onCreate(db)
// insert the data on the IO Thread
ioThread {
getInstance(context).dataDao().insertData(PREPOPULATE_DATA)
}
}
})
.build()
val PREPOPULATE_DATA = listOf(Data("1", "val"), Data("2", "val 2"))
이런식으로 list 데이터를 클래스 파일에서 만들어서 insert하던데 초기데이터를 설정하는 예시코드라 그런지는 모르겠지만 다 이렇게 하더라구요..
물론 개발자 문서에는 asset인가? 그거랑 파일에서 가져오는 방법 있던데 메모리 내 Room 데이터베이스는 지원안하다는데
이게 무슨 말인지 정확하게 몰라서 Callback 방법을 사용한 코드를 설정해놓은 상태입니다.
결국 이 Callback 방법은 내가 직접 데이터들을 만들던지 string.xml 파일에서 가져오던지해서 DB에
insert해야할듯한데..
저는 목적이 strings.xml에 있는 데이터들을 거기 안두고 DB에 두고 가져오는게 목적이라..
어떻게 방법 없을까요?
아니면 초기설정이기에 그냥 insert하고 strings에 데이터는 지워주면 되는건가요?