[안드로이드 공부]/선플라워 디비보기

[Sunflower 디비보기] ViewModel 주입(초기화) 과정

코코모아 2020. 7. 28. 16:31

아래는 코모스튜디오가 직접 만든 무료 앱이에요
(한 번만 봐주세요 ^^)

01

02

03

정각알림 만들기(말하는시계)

말하는 시계 (취침, 자전거) 

말하는 타이머 음성 스톱워치 

요약

  1. viewModel 주입(Injection)

  2. Repository 와 ViewModel 을 생성 해서 Factory 에 넣은 다음 by 로 위임된 viewModels 에 주면 viewModel 을 주입해준다.(ktx 로 ViewModelProvider.get()와 같은 역활을 한다.)

  3. 결국 viewModel (LiveData) > repository > dao > db

  4. 요렇게 연결 되어서 view 와 연결되어 작업이 될 것 이다.

  5. 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 가 없으면 생성하고

  • 백그라운드 작업(코루틴)

 
   AppDatabase 에서 instance ?: buildDatabase Worker
   DATABASE_NAME = "sunflower-db"
   PLANT_DATA_FILENAME = "plants.json" 

            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디비보기 한 것입니다.

모든 게시물은 코모스튜디오의 소유이며, 무단 복제 수정은 절대 불가입니다.
퍼가실 경우 댓글과 블로그 주소를 남기고 해당 게시물에 출처를 명확히 밝히세요.