Android、MVVM:在 ViewModel 中调用 ContentResolver

Android, MVVM: call ContentResolver in ViewModel

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

Caution: A ViewModel must never reference a view, Lifecycle, or any class that may hold a reference to the activity context.

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

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

我想在 viewModel 代码中查询数据库,但看起来 ViewModel 没有 getContentResolver() 方法或类似的方法,我不允许通过 activity 到视图模型。如何从 viewModel 中访问数据库?有可能吗?

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

您列出的注意事项是关于不在 ViewModel 中使用或存储 activity、片段、视图或其他生命周期组件 - 并不真正适用于应用程序上下文(有时需要它来获取东西像字符串,或者在你的情况下,一个 ContentResolver,它们不依赖于视图生命周期)。