Android,MVVM:在ViewModel中调用ContentResolver

Jon*_*nno 5 android mvvm android-contacts kotlin

我目前正在将代码结构重构为 MVVM 设计模式。在官方 android.com 文档(https://developer.android.com/topic/libraries/architecture/viewmodel)中,他们编写了以下内容:

注意: ViewModel绝不能引用视图、生命周期或任何可能保存对活动上下文的引用的类。

问题是,在我当前的代码中,我使用 ContentResolver 来查询手机上的联系人数据库。

var cursor: Cursor? = mainActivity.contentResolver.query(
        ContactsContract.Data.CONTENT_URI,
        projection,
        selection,
        selectionArgs,
        ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME
)
Run Code Online (Sandbox Code Playgroud)

我想在 viewModel 代码中查询数据库,但看起来ViewModel没有getContentResolver()方法或类似的东西,并且不允许我将活动传递给 viewModel。如何从 viewModel 中访问数据库?有可能吗?

Tyl*_*r V 5

如果您需要访问 ViewModel 中的上下文,您可以使用 AndroidViewModel 它允许您使用 访问应用程序上下文getApplication()。您可以使用它来获取诸如 ContentResolver 之类的东西。

您列出的警告注释是关于不在 ViewModel 中使用或存储活动、片段、视图或其他生命周期组件 - 并不真正适用于应用程序上下文(有时需要获取字符串等内容,或者在您的情况下, ContentResolver,不依赖于视图生命周期)。