【问题标题】:RoomDB SQL Query / data modelling problemRoomDB SQL 查询/数据建模问题
【发布时间】:2021-02-10 09:38:33
【问题描述】:

我正在使用 RoomDB 在我的应用程序中存储实体,到目前为止,我只需要相对琐碎的查询,例如 SELECT * FROM tableDELETE * FROM table 以及稍微复杂一些的事情,例如返回 2 个表的连接复合模型,例如SELECT * from tableA INNER JOIN ON tableB tableA.tableBId = tableB.tableBId

到目前为止,一切都很好。现在,我有一些我以前没有处理过的事情,我不确定我是否是 A)我的数据建模错误(因此无法查询来创建这些模型)或 B)我不知道零件完成这项工作所需的 SQL。

我远不是 SQL 专家,但我已经断断续续地使用它几年了。

下面是我想要实现的模型的最简单示例(标有 @Entity 以便生成 RoomDB 表):

data class FooPopulated(
    val fooId: Long,
    @Embedded
    val barOne: Bar,
    @Embedded
    val barTwo: Bar,
    @Embedded
    val barThree: Bar
)

@Entity(primaryKeys = ["fooId"])
data class FooUnpopulated(
    val fooId: Long,
    val barOneId: Long,
    val barTwoId: Long,
    val barThreeId: Long
)

@Entity(primaryKeys = ["barId"])
data class Bar(
    val barId: Long,
    val name: String
)

所以会有2张桌子; BarFooUnpopulated 我想运行一个查询,将FooUnpopulated 表条目与Bar 表条目“连接”起来,这样我就可以取回FooPopulated 的集合。

我被难住了,谁能给点建议?我的FooPopulated 模型是否只是“错误”,因为它没有定义可以通过 SQL 查询满足的有效关系,或者,我是否缺少实现这一点的神奇 SQL 关键字/理解?

【问题讨论】:

    标签: android sql kotlin android-room


    【解决方案1】:

    您可以使用一对一的关系,并且可以像这样定义 FooPopulated:

    data class FooPopulated{
     @Embeded
     val fooUnpopulated: FooUnpopulated,
     @Relation(parentColumn = "barOneId", childColumn = "barId")
     val barOne: Bar,
     @Relation( parentColumn = "barTwoId", childColumn = "barId")
     val barTwo: Bar,
     @Relation( parentColumn = "barThreeId", childColumn = "barId")
     val barThree: Bar
    }
    

    现在你可以在你的 DAO 中定义一个函数来获取这个对象:

    @Transaction
    @Query("YOUR QUERY HERE")
    fun getFooPopulated(): List<FooPopulated>
    

    更多细节在这里: https://developer.android.com/training/data-storage/room/relationships#one-to-one

    【讨论】:

    • 很好,有道理(我认为 :D)- 我想我可以快速测试它是否有效,然后决定这是否真的是我想要为我的数据建模的方式,感谢您的回答!跨度>
    • 谢谢。我忘记了字段之间的逗号,也忘记了更新变量名。所以更新了答案。
    • 另外,我认为您将答案中的FooPopulated 模型更改为具有fooUnpopulated 字段,而不仅仅是fooId
    • 是的,我已经嵌入了整个 FooUnpopulated 对象。要从结果中获取 fooId,您必须在代码中调用 objectName.fooUnpopulated.fooId。
    猜你喜欢
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 2011-01-25
    • 2010-12-20
    相关资源
    最近更新 更多