이 글은 전에 포스팅했던 ROOM(1)에 이어서 공부한 내용을 정리해보겠다!
저번 코드에 이어서 Multi Table, 테이블을 하나 추가하고, 이를 ViewModel로 분리하여
왜 viewModelScope에서 Disaptchers.IO를 사용하는지까지 알아보자.
text_table만 있던 데이터베이스에 word_table이라는 테이블을 추가해보자.
@Entity(tableName = "word_table")
data class WordEntity (
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id")
var id : Int,
@ColumnInfo(name = "text")
var text : String
)
테이블을 만들어 주었으니 Dao에 똑같이 select, delete, insert문을 만들어주자!
@Dao
interface WordDao {
@Query("SELECT * FROM word_table")
fun getAllData() : List<WordEntity>
@Insert(onConflict = OnConflictStrategy.IGNORE)
fun insert(text : WordEntity)
@Query("DELETE FROM word_table")
fun deleteAllData()
}
마지막으로 데이터베이스 클래스에서 다음과 같이 Entity를 추가하고, version을 올려 이전 버전과 다르다는 것을 알려줄 수 있다.
@Database(entities = [TextEntity::class, WordEntity::class], version = 2)
abstract class TextDatabase : RoomDatabase() {
abstract fun textDao() : TextDao
abstract fun wordDao() : WordDao
이제 두 개의 테이블을 이용할 준비를 완료했다!
원래는 MainActivity에서 db를 불러왔지만, 이제 ViewModel로 분리하여 MVVM패턴에 맞추어 구현해보자.
val db = TextDatabase.getDatabase(this)
this를 통해 액티비티에서 직접 불러왔지만 다음과 같이 변경해주었다.
class MainViewModel(application: Application) : AndroidViewModel(application) {
val context : Context = getApplication<Application>().applicationContext
val db = TextDatabase.getDatabase(context)
application을 통해 viewModel에서도 db를 불러오는 것을 가능하게 하였다.
다음, 액티비티에서 데이터를 삽입, 조회, 삭제 모든 것을 했지만 이 또한 모두 viewModel로 옮겨보자.
fun getData() = viewModelScope.launch(Dispatchers.IO) {
Log.d("MainViewModel", db.textDao().getAllData().toString())
Log.d("MainViewModel", db.wordDao().getAllData().toString())
}
fun insertData(text : String) = viewModelScope.launch(Dispatchers.IO) {
db.textDao().insert(TextEntity(0, text))
db.wordDao().insert(WordEntity(0, text))
}
fun removeData() = viewModelScope.launch(Dispatchers.IO) {
db.textDao().deleteAllData()
db.wordDao().deleteAllData()
}
여기서 Dispatchers.IO를 왜 사용하는지 궁금할 것이다.
공식문서를 살펴보면 Dispatchers.IO는 외부에서 디스크 또는 네트워크 I/O를 실행하도록 최적화되어 있다고 나온다.
또한, Room 지속성 라이브러리라고 정의하고 있으며, 데이터베이스 액세스를 가능하게 한다고 설명하고 있다.
IO말고도 Main, Default 2가지의 종류가 더 있으며 나중에 이 세 가지 모두 파헤쳐봐야겠다!!
다시 본론으로 들어가 메인액티비티에서 viewModel을 선언해준뒤, viewModel에 있는 함수들로 변경해주면 끝!
getAllBtn.setOnClickListener {
// CoroutineScope(Dispatchers.IO).launch {
// Log.d("MAINACTIVITY", db.textDao().getAllData().toString())
// Log.d("MAINACTIVITY", db.wordDao().getAllData().toString())
// }
viewModel.getData()
}
다음 게시물에서는 Room의 마지막! LiveData와 RecyclerView까지 추가하여 어떻게 활용되는지 포스팅할 예정이다!
'Android > JETPACK' 카테고리의 다른 글
[JETPACK개론] WorkManager(1) (4) | 2022.09.07 |
---|---|
[JETPACK개론] ROOM(3) (0) | 2022.09.05 |
[JETPACK개론] ROOM(1) (0) | 2022.09.02 |
[JETPACK개론] SQLite(2) (0) | 2022.08.30 |
[JETPACK개론] SQLite(1) (0) | 2022.08.29 |