android - 将 LiveData 与内容提供商结合使用

标签 android android-contentprovider android-livedata

我尝试在 Android 上将 LiveData 与 Content Provider 一起使用,但是我无法管理它,因为 Provider 查询方法如下:

public Cursor query

所以它返回一个 Cursor,而我需要一个 LiveData。 如果我尝试将查询方法的返回类型更改为

public LiveData<Cursor> query

我收到错误:

 "error: query(Uri,String[],String,String[],String) in FaProvider cannot override query(Uri,String[],String,String[],String) in ContentProvider
return type LiveData<Cursor> is not compatible with Cursor"

是否有将 LiveData 与 Content Provider 结合使用的解决方案?

最佳答案

应该能够用可变的实时数据对象包装光标,如@mohd-faizan提到的

abstract class ContentProviderLiveData<T>(
private val context: Context,
private val uri: Uri ) : MutableLiveData<T>() {
private lateinit var observer: ContentObserver

override fun onActive() {
    observer = object : ContentObserver(null) {
        override fun onChange(self: Boolean) {
            // Notify LiveData listeners an event has happened
            postValue(getContentProviderValue())
        }
    }

    context.contentResolver.registerContentObserver(uri, true, observer)    }

override fun onInactive() {
    context.contentResolver.unregisterContentObserver(observer)
}

/**
 * Implement if you need to provide [T] value to be posted
 * when observed content is changed.
 */
abstract fun getContentProviderValue(): T

}

更多内容请看这里: https://medium.com/@jmcassis/android-livedata-and-content-provider-updates-5f8fd3b2b3a4

关于android - 将 LiveData 与内容提供商结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52594694/

相关文章:

android - 从 Intent 检索 Extras 时出现 NullPointerException

android - 如何在 Activity 中使用 Room 和 LiveData 删除 LiveData<Object>?

java - 刚刚创建后更新注释

android - 无法解析 : livedata-core

java - 通过 SQLite Manager 更新我的 SQLite 数据库列后,为什么更改没有反射(reflect)在我的 Android 应用程序中?

java - 我们如何从基类中检索接口(interface)并测试它?

android - 使用 ContentProviderClient 与 ContentResolver 访问内容提供者

android - 拥有带有 SQLite 和多个表的 ContentProvider

Android:无法使用下载管理器将从服务器下载的数据保存到内存

java - MQTT Android 未连接到 ActiveMq