如何使用koin在ViewModel中注入Room

时间:2020-07-28 04:02:09

标签: android kotlin mvvm android-room koin

这是我第一个使用koin的mvvm项目,正在使用Room数据库。我正在用viemwodel进行网络调用,并且从api提取数据后,我想将其存储在数据库中。下面是我的类,其中包含所有数据库方法,例如insert和delete。

class UserViewModel(application: Application) : AndroidViewModel(application) {
   
    private val userSDAO: UserDAO
    private val userDB: AppSettingsDatabase

    init {
        userDB = AppSettingsDatabase.getAppSettingsDatabase(application.applicationContext)!!
        userDAO = userDB.userDao()
    }

    fun getAppSetting():LiveData<AppSettingsEntity>{
        return userDB.appSettingDao().getAllAppSettings()
    }

    fun deleteUser() {
        userDB.databaseWriteExecutor.execute { ->
            userDAO.deleteUser()
        }
    }
}

我当时是通过这样的活动来称呼这个班的

userViewModel = ViewModelProvider(this).get(UserViewModel::class.java)

现在我想在一个进行网络api调用的viewmodel类中调用它,但我不知道使用koin或其他任何方式访问它的最佳方法是什么。我需要使用不同的方法数据库访问,我必须在每种方法中像上面一样对其进行初始化。

class SubscriptionViewModel(): BaseViewModel() {

    fun init(owner:ViewModelStoreOwner) { 
        userServiceViewModel = ViewModelProvider(owner).get(UserServiceViewModel::class.java)
    } 
}

1 个答案:

答案 0 :(得分:3)

通常,最好不要访问ViewModel中的db对象。我的意思是,应该在数据源类中使用dao,然后将数据源注入到ViewModel中,甚至更好,在存储库中使用数据源,然后在ViewModel中注入存储库

此后,您不能再访问另一个ViewModel中的一个。他们应该是独立的。如果要对多个ViewModel中的数据库或API进行操作,请通过一个公共存储库类访问它们。

请看看:https://developer.android.com/jetpack/guide#overview