ROOM드디어 마지막 포스팅!!
이제 전 글에 이어서 LiveData와 RecyclerView, 그리고 Repository이용해서 불러오는 것까지 구현해보자!
먼저 레이아웃에 리사이클러뷰, item 그리고 어댑터클래스부터 먼저 생성해주자.
class CustomAdapter(private val dataSet : List<TextEntity>) : RecyclerView.Adapter<CustomAdapter.ViewHolder>() {
class ViewHolder(view : View) : RecyclerView.ViewHolder(view){
val textView : TextView = view.findViewById(R.id.textView)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomAdapter.ViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.text_row_item, parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: CustomAdapter.ViewHolder, position: Int) {
holder.textView.text = dataSet[position].text
}
override fun getItemCount(): Int {
return dataSet.size
}
}
테이블에 있는 text가 item 레이아웃에 있는 text로 설정해준뒤 넘어가자.
다음 ViewModel에서 LiveData를 추가해주자!
private var _textList = MutableLiveData<List<TextEntity>>()
val textList : LiveData<List<TextEntity>>
get() = _textList
private var _wordList = MutableLiveData<List<WordEntity>>()
val wordList : LiveData<List<WordEntity>>
get() = _wordList
위와 같이 각각의 Entity 리스트로 LiveData로 설정해놓고, 이는 액티비티에서 Observer를 통해 text값을 바꾸기 위함이다!
그럼 이제 Repository로 분류하기 위해 클래스를 생성하고,
ViewModel에서 디비에 바로 접근하지 않고, Repository를 통해 접근해보자!
class Repository(context : Context) {
val db = TextDatabase.getDatabase(context)
fun getTextList() = db.textDao().getAllData()
fun getWordList() = db.wordDao().getAllData()
fun insertTextData(text : String) = db.textDao().insert(TextEntity(0, text))
fun insertWordData(text : String) = db.wordDao().insert(WordEntity(0, text))
fun deleteTextData() = db.textDao().deleteAllData()
fun deleteWordData() = db.wordDao().deleteAllData()
}
class MainViewModel(application: Application) : AndroidViewModel(application) {
val context : Context = getApplication<Application>().applicationContext
val repository = Repository(context)
MainViewModel에 있는 context를 repository로 넘겨준 뒤, ViewModel에서 repository에 테이블에 접근하자.
fun getData() = viewModelScope.launch(Dispatchers.IO) {
// Log.d("MainViewModel", db.textDao().getAllData().toString())
// Log.d("MainViewModel", db.wordDao().getAllData().toString())
_textList.postValue(repository.getTextList())
_wordList.postValue(repository.getWordList())
}
fun insertData(text : String) = viewModelScope.launch(Dispatchers.IO) {
// db.textDao().insert(TextEntity(0, text))
// db.wordDao().insert(WordEntity(0, text))
repository.insertTextData(text)
repository.insertWordData(text)
}
fun removeData() = viewModelScope.launch(Dispatchers.IO) {
// db.textDao().deleteAllData()
// db.wordDao().deleteAllData()
repository.deleteTextData()
repository.deleteWordData()
}
기존에 있던 주석처리를 한 코드보면 이해가 쉬울 것이다.
또한, getData에서는 LiveData의 값을 변경시켜 액티비티에서 다음과 같이 관찰하여 text의 값을 변경시켜보자.
val rv = findViewById<RecyclerView>(R.id.rv)
viewModel.textList.observe(this, Observer {
val customAdapter = CustomAdapter(it)
rv.adapter = customAdapter
rv.layoutManager = LinearLayoutManager(this)
})
getAllBtn.setOnClickListener {
viewModel.getData()
}
getAll 버튼을 클릭했을 때 viewModel에 있는 LiveData를 변경시키고,
변경시킨 값을 Observer를 통해 리사이클러뷰에 있는 어댑터를 연결시켜 View에 데이터가 나타나게끔 하였다.
Room을 통해 리사이클러뷰, MVVM패턴을 적용하여 ViewModel과 LiveData까지 여태까지 공부했던 내용들을
종합적으로 묶어 사용해보았다.
나름 공부했던 내용들을 어떻게 적용할까? 고민하면서 꾸준히 복습하니 처음에 어려웠던 개념들은
점점 익숙해져가고 있다!!
앞으로도 초심잃지 말고 JetPack 공부 열심히해서 기업에 적합한 인재가 되려고 노력해야겠다!
'Android > JETPACK' 카테고리의 다른 글
[JETPACK개론] WorkManager(2) + Sending, Receiver Data (0) | 2022.09.08 |
---|---|
[JETPACK개론] WorkManager(1) (4) | 2022.09.07 |
[JETPACK개론] ROOM(2) (0) | 2022.09.03 |
[JETPACK개론] ROOM(1) (0) | 2022.09.02 |
[JETPACK개론] SQLite(2) (0) | 2022.08.30 |