【问题标题】:How to convert LiveData Entitiy to LiveData Domain model如何将 LiveData 实体转换为 LiveData 域模型
【发布时间】:2021-06-09 14:49:09
【问题描述】:

我正在使用存储库模式开发 MVVM kotlin 应用程序

我已将我的模型类分开如下

  • classes 代表来自网络的数据
  • 类代表房间数据库的实体
  • 代表领域的类

在我的存储库中,我希望始终返回域对象,而不是网络对象或实体对象。

在我的 Dao 中,我插入和检索实体对象,如下所示

@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertAsteroids(asteroid: List<AsteroidEntity>)

@Query("SELECT * FROM asteroid_tbl")
fun getAsteroidsFromDb () : LiveData<List<AsteroidEntity>>

我在存储库中有一个函数,可以将小行星列表作为实时数据从房间返回,如下所示

override suspend fun getAsteroids(): LiveData<List<Asteroid>> {
            return appLocalDb.asteroidDao.getAsteroidsFromDb()
}

但问题是 dao 返回一个 LiveData&lt;List&lt;AsteroidEntity&gt;&gt; 而存储库我希望它返回域模型 LiveData&lt;List&lt;Asteroid&gt;&gt;

关于如何解决这个问题有什么建议吗?

【问题讨论】:

  • 你应该使用mapping一个DAO的方法来处理一个模型对象。
  • 我确实有一个将实体映射到域模型的映射器。但在我的情况下,我有一个域对象列表的实时数据。映射器只是将实体对象转换为域对象或将实体对象列表转换为域对象列表。

标签: android kotlin mvvm repository dao


【解决方案1】:

使用Transformations.map

override suspend fun getAsteroids(): LiveData<List<Asteroid>> {
            return Transformations.map(appLocalDb.asteroidDao.getAsteroidsFromDb()) { it.map{ item -> Asteroid(item.name,....)} }
}

更多文档请查看文档 https://developer.android.com/reference/android/arch/lifecycle/Transformations

【讨论】:

  • 这里的“它”代表小行星的列表,而不是单个物体。我需要遍历列表
  • 这将导致类型不匹配错误,因为它将返回 List 而函数需要返回 LiveData>
  • 试试看。我们实际上正在改变实时数据的价值。返回类型将为 LiveData>
  • 我试过了,显示类型不匹配错误
  • 对不起,伙计!我遇到了一些导致问题的错字,它实际上返回了一个 LiveData!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-29
  • 1970-01-01
  • 2020-01-22
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多