kotlin Android存储库模式将空间转换为域模型

ehxuflar  于 2023-01-17  发布在  Kotlin
关注(0)|答案(2)|浏览(132)

我正在拼命寻找一种可能性,将房间模型转换为域模型,以启用离线功能到我的应用程序。我已经成功地实现了这个模式,如下面的代码实验室所述:https://codelabs.developers.google.com/codelabs/kotlin-android-training-repository/#0
但是我在我的域模型中使用了分页库-〉PagedList<com.trashmaster.muellmister.network.Place>,我需要将其转换为PagedList<com.trashmaster.muellmister.data.Place>以插入数据。x1c 0d1x
在我的ViewModel在另一边我需要(转换房间模型到网络模型.

var properties: LiveData<PagedList<com.trashmaster.muellmister.network.Place>> (ViewModel)

是否有一些最佳实践?是否有可能合并网络数据模型和房间数据模型?
在线功能可以完美地工作,但是结合分页数据源实现离线功能是很困难的。
这是通往我源头的路
https://gist.github.com/DoomMortal/fa2c243d13d72a37988d12096cf8312a
任何帮助都将不胜感激。
先谢了

9cbw7uwe

9cbw7uwe1#

看看这个链接。正如你在链接中看到的,他们使用了一个Map器:

fun List<DatabaseVideo>.asDomainModel(): List<DevByteVideo> {
   return map {
       DevByteVideo(
               url = it.url,
               title = it.title,
               description = it.description,
               updated = it.updated,
               thumbnail = it.thumbnail)
   }
}

他们使用此扩展函数从database model创建domain model,而这正是您所缺少的

ftf50wuq

ftf50wuq2#

在我看来,最好的实践是正如@Biscuit已经回答的那样,编写一个Map器,将数据库中的对象Map到一个易于使用的模型(您的MainModel)。
它还进一步分离了代码,以遵循干净的架构--关注点分离。
The code you provided.
所以首先,我将把代码从MainModel.kt移到一个数据类中,这个数据类表示您的Dao-response,我们称之为"DaoResultModel.kt"。

@Entity
data class MainModel(
    @PrimaryKey @Json(name = "id") val id: Int,
    @Json(name = "userId") val userId: String,
    @Json(name = "ortId") val ortId: String,
    @Json(name = "plz") val plz: String,
    @Json(name = "name") val name: String,
    @Json(name = "picture") val picture: String,
    @Json(name = "streetId") val streetId: Int,
    @Json(name = "streetName") val streetName: String
)

这样,您可以保留MainModel类,而只是删除注解。

data class MainModel(
    val id: Int,
    val userId: String,
    val ortId: String,
    val plz: String,
    val name: String,
    val picture: String,
    val streetId: Int,
    val streetName: String
)

现在编写Map器。让我们称之为"DaoResultMapper. kt"。这个Map器定义了一个扩展函数,它将你的响应从daoMap到你的MainModel。
不要把它 Package 在一个类中,只要插入函数,这样它们仍然与你的DaoResultModel相关联。

fun DaoResultModel.mapToEntity() = MainModel(
    id = id,
    userId = userId,
    ortId = ortId,
    plz = plz,
    name = name,
    picture = picture,
    streetId = streetId,
    streetName = streetName
)

现在,在数据库请求之后调用函数。

var properties: LiveData<PagedList<com.trashmaster.muellmister.network.Place>> 

properties.value =
    videosRepository.data.mapToEntity()

在这一点上我还不确定,因为您需要一个PagedList,所以您可能必须用mapToEntity()Map每个条目,但为此我缺少完整的代码。
希望能有所帮助!

相关问题