首页 > 解决方案 > Android Clean Architecture:当模型引用两个房间表时缓存映射

问题描述

我有一个将两个表连接在一起的查询。我在 kotlin 中创建了一个数据类,其中包含查询返回的每个表中的 val。当我在 DAO 查询中更新模型时,我显然必须通过干净拱门的层来更新模型类。我得到了将实体映射到域层的 Mapper 类。在这里我遇到了一个问题,因为该函数只能扩展到一个房间实体,而我的数据类引用了两个表中的值。

界面

interface EntityMapper <Entity, DomainModel>{

fun mapFromEntity(entity: Entity): DomainModel
fun mapToEntity(domainModel: DomainModel): Entity
}

班级

 fun entityListToList(entityTableA: List<TableA>): List<Model> {
    val list: ArrayList<Model> = ArrayList()
    for (entity in entityTableA) {
        list.add(mapFromEntity(entity))
    }
    return list
}


fun listToEntityList(entityTableA: List<Model>): List<TableA> {
    val entity: ArrayList<TableA> = ArrayList()
    for (entity in entityTableA) {
        entity.add(mapToEntity(entityTableA))
    }
    return entityTableA
}


override fun mapFromEntity(entityTableA: TableA): Model{
    return Model()
}


 override fun mapToEntity(domainModel: Model): TableA{
    return TableA
}

因此,此函数缺少表 B 中的所有值,因为我无法在映射器函数中扩展这两个表。人们如何解决这个问题,因为它可能在干净的架构中运行联合查询,否则在任何不简单的应用程序中都是毫无意义的。

标签: androidandroid-roomclean-architecture

解决方案


你没有提供足够的代码,但我猜你的映射器看起来像这样:

interface Mapper<F, S> {
    fun firstToSecond(first: F): S
    fun secondToFirst(second: S): F
}

然后,如果您需要将一个类映射到两个单独的类,则需要使用Pair.

class MyMapper<CustomModel, Pair<TableA, TableB> {
    override fun mapToEntity(domainModel: CustomModel): Pair<TableA, TableB>{
        ...
}

推荐阅读