쏭식
Ssongcode;
쏭식
전체 방문자
오늘
어제
  • 분류 전체보기 (106)
    • JAVA (21)
      • Basic (21)
    • Kotlin (14)
      • Basic (14)
    • Android (64)
      • Basic (24)
      • JETPACK (30)
      • Compose (8)
      • 파고들기 (2)
    • Project (4)
    • etc (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • compose
  • 배열
  • 변수
  • mvvm
  • 알고리즘
  • 코틀린
  • ViewModel
  • Kotlin
  • workmanager
  • 백준
  • 코드업100제
  • Android
  • 메소드
  • 객체지향
  • Jetpack
  • DataBinding
  • 프로젝트회고
  • AAC
  • livedata
  • 자료구조
  • Room
  • 자바
  • 기초100제
  • 코딩테스트
  • Adapter
  • 리사이클러뷰
  • 코틀린코테
  • 코테
  • 컴포즈
  • 상속

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
쏭식

Ssongcode;

Android/JETPACK

[JETPACK개론] ROOM(2)

2022. 9. 3. 23:59

이 글은 전에 포스팅했던 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
    'Android/JETPACK' 카테고리의 다른 글
    • [JETPACK개론] WorkManager(1)
    • [JETPACK개론] ROOM(3)
    • [JETPACK개론] ROOM(1)
    • [JETPACK개론] SQLite(2)
    쏭식
    쏭식

    티스토리툴바