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,它们不依赖于视图生命周期)。
我目前正在将我的代码结构重构为 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,它们不依赖于视图生命周期)。