我有一个API,它返回一个包含实体的DTO,这些实体具有填充在列表中的一对多关系。
我很难弄清楚如何处理房间里的数据。
我需要将此DTOMap到相应的实体。然后,我需要将它们插入到数据库中。稍后,我需要查询它们并检索BoardEntity
及其相应BoardChildEntities
的列表
fun getBoards() = networkBoundResource(query = {
// I need to query all boards from Room and add to that its corresponding children in a list
},
fetch = {
api.getBoards()
},
saveFetchResult = { dtos ->
// how can I save all the data in the DTOs in their corresponding tables
// without writing a lot of nested loops
})
从API返回的DTO:
data class BoardDto(
val id: Int,
val name: String,
val boardChildren: List<BoardChildDto>,
) {
data class BoardChildDto(
val id: Int,
val boardId: Int, // foreign key
val name: String,
val boardElements: List<BoardElementDto>,
) {
data class BoardElementDto(
val id: Int,
val boardChildId: Int, // foreign key
val name: String,
val type: String,
val hyperlinks: List<BoardElementHyperlinkDto>,
) {
data class BoardElementHyperlinkDto(
val id: Int,
val boardElementId: Int, // foreign key
val name: String,
)
}
}
}
房间实体:
@Entity
data class BoardEntity(
@PrimaryKey(autoGenerate = false) val id: Int,
val icon: String,
val name: String,
)
@Entity(
foreignKeys = [ForeignKey(
entity = BoardEntity::class,
parentColumns = ["id"],
childColumns = ["boardId"],
onDelete = ForeignKey.CASCADE
)]
)
data class BoardChildEntity(
@PrimaryKey(autoGenerate = false) val id: Int,
val boardId: Int,
val name: String,
)
@Entity(
foreignKeys = [ForeignKey(
entity = BoardChildEntity::class,
parentColumns = ["id"],
childColumns = ["boardChildId"],
onDelete = ForeignKey.CASCADE
)]
)
data class BoardElementEntity(
@PrimaryKey(autoGenerate = false) val id: Int,
val boardChildId: Int,
val name: String,
)
@Entity(
foreignKeys = [ForeignKey(
entity = BoardElementEntity::class,
parentColumns = ["id"],
childColumns = ["boardElementId"],
onDelete = ForeignKey.CASCADE
)]
)
data class BoardElementHyperlinkEntity(
@PrimaryKey(autoGenerate = false) val id: Int,
val boardElementId: Int,
val name: String,
)
从DTO到文件室实体的Map器
fun BoardDto.toEntityModel(): BoardEntity {
return BoardEntity(
id = id,
name = name,
)
}
fun BoardChildDto.toEntityModel(): BoardChildEntity {
return BoardChildEntity(
id = id,
boardId = boardId,
name = name,
)
}
fun BoardElementDto.toEntityModel(): BoardElementEntity {
return BoardElementEntity(
id = id,
boardChildId = boardChildId,
name = name,
)
}
fun BoardElementHyperlinkDto.toEntityModel(): BoardElementHyperlinkEntity {
return BoardElementHyperlinkEntity(
id = id,
boardElementId = boardElementId,
name = name,
)
}
1条答案
按热度按时间tag5nh1u1#
//如何将DTO中的所有数据保存到对应的表中
//不需要编写大量嵌套循环
取决于你所谓的地段,有些是无法避免的。
下面是一个如何实现这一点的示例(来自一个
@Dao
注解接口):最初的4个标准便利插页
然后一个函数体包含3个嵌套循环(请注意,为了减少演示外键级联并覆盖硬代码值的麻烦(请参见演示和结果))。如果正确,可以使用实际值的(如果不是,那么你会遇到外键冲突)。类似地,如果一个插入在任何级别被忽略,那么就会立即返回,Int根据coming常量返回(-99到-96,包括-99和-96)(这种行为可以很容易地去除)。
稍后,我想查询它们并检索一个BoardEntity及其对应的BoardChildEntities列表
并且我假设具有子BoardElement以及HyperLink子项(向下贯穿所有层次结构)。
为此,您可以使用POJO的层次结构,每个POJO获取父项和子项。例如,以下POJO的父项具有
@Embed
注解,子项列表具有@Relation
注解。@Relation
中,实体=是@Entity
注解类而不是字段类。演示
这是一个工作演示,运行时,take从BoardDTO添加数据,然后提取它(尽管替换了一些引用,如boardId)。
首先是整个数据库的代码,还有你的BoardDTo(你的Map器还没有被使用):-
要实际测试以下活动代码(MainActivity):-
运行时,输出到日志的结果为:-
通过应用程序检查数据库:-