当前位置: 首页 > 知识库问答 >
问题:

当androidx.paging.DataSource. Factory时,房间无法检索数据(使用LiveData静态编程语言协程)

戚明朗
2023-03-14

我有一个AmbassadorDAO,它有一个getAll():列表

当我使用DataSource. Factory对我的列表进行分页时,问题就出现了

这是密码

活动

class AmbassadorActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        ...

        val viewModel by viewModel<AmbassadorViewModel>()

        val adapter = AmbassadorAdapter(this)
        list_of_ambassadors.adapter = adapter

        viewModel.ambassadors.observe(this, Observer { adapter.submitList(it) })

        viewModel.listAmbassadors()

        ...
    }

    ...
}

视图模型

class AmbassadorViewModel(
    ...,
    private val getAllAmbassadorInteractor: GetAllAmbassadorInteractor
) : ViewModel() {

    ...

    // not working
    private val _ambassadors = MutableLiveData<PagedList<Ambassador>>()

    // it's working
    //private val _ambassadors = MutableLiveData<List<Ambassador>>()

    ...

    // not working
    val ambassadors : LiveData<PagedList<Ambassador>>
        get() =  _ambassadors

    // it's working
    //val ambassadors : LiveData<List<Ambassador>>
    //    get() =  _ambassadors

    ...

    fun listAmbassadors() {
        viewModelScope.launch {
            try {
                ...

                // not working
                // the data not return anything
                // the livedata is notified with null
                val data = getAllAmbassadorInteractor.exec()
                _ambassadors.value = LivePagedListBuilder(data, 20).build().value

                // it's working
                //_ambassadors.value = getAllAmbassadorInteractor.exec()

            } catch (e: Exception) {
                e.printStackTrace()
            } finally {
                ...
            }
        }
    }

}

演示之间的界限(我的用例界面)

interface GetAllAmbassadorInteractor {

    //suspend fun exec() : List<Ambassador>
    suspend fun exec() : DataSource.Factory<Int, Ambassador>

}

用例实现

class GetAllAmbassadorInteractorImpl(
    private val repository: AmbassadorRepository
) : GetAllAmbassadorInteractor {

    override suspend fun exec() = withContext(Dispatchers.IO) { repository.getAll() }

}

数据之间的边界(我的存储库界面)

interface AmbassadorRepository {

    ...

    //suspend fun getAll() : List<Ambassador>
    suspend fun getAll() : DataSource.Factory<Int, Ambassador>

    ...

}

存储库实现

class AmbassadorRepositoryImpl(
    private val ambassadorDAO: AmbassadorDAO
) : AmbassadorRepository {

    ...

    override suspend fun getAll() = ambassadorDAO.getAll().map { it.toDomain() }

    ...

}

我的DAO

@Dao
interface AmbassadorDAO {

    ...

    @Query("SELECT * FROM ${AmbassadorEntity.TABLE_NAME} ORDER BY name DESC")
    fun getAll(): DataSource.Factory<Int, AmbassadorEntity>
    //fun getAll(): List<AmbassadorEntity>

    ...

}

我哪里记错了?


共有2个答案

淳于凯
2023-03-14

有了Kotlin extension(LifecycleScope)的支持,我们可以轻松地将LiveData与Coroutine连接起来,而不需要使用_ambassadors之类的支持属性,并使其成为可变LiveData。

androidx.lifecycle:lifecycle-runtime-ktx:2.2.0-alpha01 or higher.

这是一个使用协同程序并返回LiveData的函数

/**
 * Get all news rows livedata pageList from DB using Coroutine.
 */
suspend fun getAllNewsLiveData(): LiveData<PagedList<News>> {
    return withContext(Dispatchers.IO) {
        val data = mDao.getAllNews()
        LivePagedListBuilder(data, Constants.PAGINATION_SIZE).build()
    }

}

现在在UI类中,我们可以简单地使用生命范围扩展调用此函数

  lifecycleScope.launchWhenStarted {
        newsViewModel.getNews()?.observe(this@NewsActivity, Observer { pagedNewsList -> pagedNewsList.let { newsAdapter.submitList(pagedNewsList) } })
    }
赫连棋
2023-03-14

我猜你的错误是在AmbassadorViewModel课程中的这一行:

_ambassadors.value = LivePagedListBuilder(data, 20).build().value

而不是那个用法:

_ambassadors.value = LivePagedListBuilder(data, 20).build()

也参考这篇文章,也许会有帮助。

 类似资料:
  • 我试图在kotlin中的两个活动之间传递一个值,但如果我使用下面的代码,那么我只得到“Hello World”默认值,而不是PREFERENCE_NAME值。我的文本ID名称是android: id="@id/tv_count"感谢任何帮助。

  • 我试图用OkHttp和Cucumber在静态编程语言中设置一个Spring启动项目,并且在运行Cucumber任务时遇到以下错误。如何修复? 还有build gradle kts片段 我看到了这个错误https://github.com/square/okio/issues/647看起来可能是它,并修复了这个build.gradle,我如何将其翻译为kotlinbuild.gradle.kts?

  • 我试图从数据库检索提交的请求。 用户类 错误消息是: 如何从数据库中正确检索提交的请求?

  • 我正在与Room持久性库集成。我有一个静态编程语言的数据类: 和注释用于Room库。当我试图构建时,它失败了: 我还尝试提供默认构造函数: 但这并不奏效。需要注意的是,如果我将这个Kotlin类转换成一个带有getter和setter的Java类,它就会工作。感谢您的帮助!

  • 我在静态编程语言中扩展ArrayAdapter时遇到了问题。 这里的代码: 编辑与ArrayAdapter扩展无关。我的问题是构装师的理解。

  • 我知道内联函数可能会提高性能 编译器可以发出以下代码,而不是为参数创建函数对象并生成调用。(来源) 但是我发现没有kotlin为一个非内联函数创建的函数对象。为什么?