将LiveData与Content Provider一起使用

lte*_*one 8 android android-contentprovider android-livedata

我正在尝试将LiveData与Android上的Content Provider一起使用,但是由于Provider查询方法如下,因此无法对其进行管理:

public Cursor query
Run Code Online (Sandbox Code Playgroud)

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

public LiveData<Cursor> query
Run Code Online (Sandbox Code Playgroud)

我得到错误:

 "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"
Run Code Online (Sandbox Code Playgroud)

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

pan*_*s27 0

应该能够用可变的实时数据对象包装光标,如@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
Run Code Online (Sandbox Code Playgroud)

}

更多信息: https ://medium.com/@jmcassis/android-livedata-and-content-provider-updates-5f8fd3b2b3a4