아래는 코모스튜디오가 직접 만든 무료 앱이에요(한 번만 봐주세요 ^^)
요약
-
viewModel 주입(Injection)
-
Repository 와 ViewModel 을 생성 해서 Factory 에 넣은 다음 by 로 위임된 viewModels 에 주면 viewModel 을 주입해준다.(ktx 로 ViewModelProvider.get()와 같은 역활을 한다.)
-
결국 viewModel (LiveData) > repository > dao > db
-
요렇게 연결 되어서 view 와 연결되어 작업이 될 것 이다.
-
M-V-VM
private val viewModel: GardenPlantingListViewModel by viewModels {
InjectorUtils.provideGardenPlantingListViewModelFactory(requireContext())
}
-
Factory: GardenPlantingListViewModel
-
ViewModel: GardenPlantingListViewModel
-
Repository: GardenPlantingRepository
Factory 생성
-
DB 가 없으면 생성하고
-
Repository 생성,
-
ViewModel 생성, LiveData 연결된 ViewModel 을 팩토리에 담기
/*
* 주입을 위한 Factory 생성 **
* Repository 를 생성해서
* Factory 에 넣고
* ViewModel 을 생성한다음
ViewModel 은 보여줘야할 Garden 을 DB 에서 Dao 로 읽어와서 LiveData 로 연결 한다.
- plantAndGardenPlantings: LiveData
* 결국 생성된 Factory 를 viewModels 에 반환 한다.
- viewModels 에 돌려 주면 viewModel: GardenPlantingListViewModel 에 주입한다.
*/
fun provideGardenPlantingListViewModelFactory(
context: Context
): GardenPlantingListViewModelFactory {
return GardenPlantingListViewModelFactory(getGardenPlantingRepository(context))
}
Repository 생성
/*
* Repository 생성(및 get)
* DB 를 생성하고
* DAO 를 만들어서
* Repository 를 생성한다.
*/
private fun getGardenPlantingRepository(context: Context): GardenPlantingRepository {
return GardenPlantingRepository.getInstance(
AppDatabase.getInstance(context.applicationContext).gardenPlantingDao())
}
DB 생성 및 Repository 생성
-
DB 가 없으면 생성하고
-
백그라운드 작업(코루틴)
Json 에서 읽어와서 SeedDatabaseWorker doWork 코루틴에서 Json 을 열고 Room DB 에 채운다 AppDatabase 의 인스턴트를 얻어서.getInstance().dao.insertAll() |
ViewModel 생성
Factory 는 VM을 생성하고, LiveData 를 연결 한다.
class GardenPlantingListViewModelFactory(
private val repository: GardenPlantingRepository
) : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return GardenPlantingListViewModel(repository) as T
}
}
/*
정원 페이지에서 보여줘야할 데이터를 Dao 에서 Select 해와서 LiveData 에 담는다
*/
class GardenPlantingListViewModel internal constructor(
gardenPlantingRepository: GardenPlantingRepository
) : ViewModel() {
val plantAndGardenPlantings: LiveData<List<PlantAndGardenPlantings>> =
gardenPlantingRepository.getPlantedGardens()
}
Subscribe in Fragment
-
생성된 ViewModel 을 View와 연결 하는 observe 작업
-
viewModel.plantAndGardenPlantings → LiveData
-
데이터가 바뀌면 UI 값과 ListAdapter 를 업데이트 한다.
subscribeUi(adapter, binding)
private fun subscribeUi(adapter: GardenPlantingAdapter, binding: FragmentGardenBinding) {
viewModel.plantAndGardenPlantings.observe(viewLifecycleOwner) { result ->
binding.hasPlantings = !result.isNullOrEmpty()
adapter.submitList(result)
}
}
Android AAC JetPack Sunflower
이 글은 코모가 구글 안드로이드 Sunflower를 디비보기 한 것입니다.
' [안드로이드 공부] > 선플라워 디비보기' 카테고리의 다른 글
[Sunflower 디비보기] BindingAdapter로 View visible/gone (0) | 2020.07.30 |
---|---|
[Sunflower 디비보기] Detail View 에서 Garden 으로 아이템 담기 MVVM (0) | 2020.07.29 |
[Sunflower 디비보기] Activity, Fragment, Navigation 시작 (0) | 2020.07.29 |
[Sunflower 디비보기] 데이터 바인딩으로 ImageView 에 Glide (0) | 2020.07.29 |
[Sunflower 디비보기] 데이터 바인딩과 HtmlCompat.fromhtml (0) | 2020.07.29 |
모든 게시물은 코모스튜디오의 소유이며, 무단 복제 수정은 절대 불가입니다. |
퍼가실 경우 댓글과 블로그 주소를 남기고 해당 게시물에 출처를 명확히 밝히세요. |